设计模式-策略模式

1、概述

策略模式(strategy pattern)的原始定义是:定义一系列算法,将每一个算法封装起来,并使它们可以相互替换。策略模式让算法可以独立于使用它的客户端而变化。

2、优缺点

优点

算法可以自由切换。这是策略模式本身的定义,只要实现抽象策略就可以作为一个“策略”
避免使用多重条件判断。可以减少if-else的使用
拓展性良好。

缺点

策略类数量增多,且可复用性小
所有策略都要对外暴露。上层模块必须知道有哪些策略,然后才能决定使用,幸运的是可以使用其他模式来修正这个缺陷,如:工厂方法模式、代理模式、享元模式

3、实现方式


public class Test {
    public static void main(String[] args) {
        Context context;
        // 刚到吴国时拆第一个
        System.out.println("-----初到吴国启用第一个策略-----");
        context = new Context(new BackDoor());
        context.operate();
        // 刘备乐不思蜀时
        System.out.println("-----刘备乐不思蜀启用第二个策略-----");
        context = new Context(new GivenGreenLight());
        context.operate();
        // 孙权追兵赶来
        System.out.println("-----孙权追兵赶来启用第三个策略-----");
        context = new Context(new BlockEnemy());
        context.operate();
    }
}

/**
 * 策略接口
 */
public interface IStrategy {
    // 每个策略必有一个执行的方法
    public void operate();
}

/**
 * 找乔国老开后门
 */
public class BackDoor implements IStrategy {
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}

/**
 * 吴国太开绿灯
 */
public class GivenGreenLight implements IStrategy {
    @Override
    public void operate() {
        System.out.println("求吴国太开绿灯,放行");
    }
}

/**
 * 孙夫人断后
 */
public class BlockEnemy implements IStrategy {
    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}

/**
 * 锦囊
 */
public class Context {
    private IStrategy strategy;
    // 构造函数,需要使用哪个策略
    public Context(IStrategy strategy){
        this.strategy = strategy;
    }
    // 使用策略
    public void operate(){
        this.strategy.operate();
    }
}

4、应用场景

支付方式选择:在电子商务平台中,用户可以选择不同的支付方式,如信用卡、PayPal、微信支付等。每种支付方式都是一个策略,可以根据用户的选择动态切换。

排序算法:在需要排序数据时,可能会有多种排序算法,如快速排序、归并排序、冒泡排序等。策略模式允许用户根据需要选择最合适的排序算法。

图形渲染:在图形处理软件中,不同的图形对象可能需要不同的渲染策略,例如,2D图形和3D图形的渲染方式不同。

数据访问:在多层架构中,数据访问层可能会使用不同的数据源或访问技术(如数据库、文件系统、远程服务等),策略模式可以用来封装这些不同的访问方式。

缓存策略:在需要缓存数据的系统中,可能会有多种缓存策略,如LRU(最近最少使用)、FIFO(先进先出)等,策略模式可以用来实现这些不同的缓存策略。

日志记录:在应用程序中,可能会有多种日志记录方式,如控制台日志、文件日志、数据库日志等。策略模式可以用来根据不同的需要选择不同的日志记录方式。

用户权限验证:在需要权限控制的系统中,可能会有多种权限验证策略,如基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)等。

算法动态切换:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。

游戏AI行为:在游戏开发中,不同的角色可能会有不同的行为策略,如攻击、防御、逃跑等,策略模式可以用来实现这些不同的行为。

配置文件解析:在需要解析不同格式配置文件的系统中,如XML、JSON、YAML等,策略模式可以用来封装不同的解析算法。

This entry was posted in 应用, 设计模式. Bookmark the permalink.