首页 > 代码库 > 策略模式笔记

策略模式笔记

定义

策略模式是一个在可以在运行时选择算法行为的设计模式。

策略模式:

  • 定义了一个算法族

  • 封装每个算法

  • 族内的算法可以相互替换

此模式让算法的变化独立于使用算法的客户。使用策略模式时,我们可以通过输入数据、数据的类型或者其他可以识别的因素来选择不同的算法,这些因素我们直到运行时才能获取到。

比如不同的薪资有不同的个人所得税算法,购物时花费不同的价格有不同的优惠策略,交税在不同国家有不同的计算方法等等。我们可以定义一系列对应的策略算法,之后通过个人薪资、花费的价格、所在的地区,选择对应的策略进行计算。

使用

技术分享

定义一个策略接口和几个实现此接口的类,客户端持有一个策略接口,在运行时根据输入数据等信息选择对应的具题策略赋值给接口,之后执行策略接口的方法(即对应的具体实现类中实现的方法)。

对于不熟悉上面UML的可以阅读深入浅出UML类图看懂UML类图和时序图了解一下。

代码(Java)

// 策略接口
public interface Strategy {
    void execute();
}
?
// 具体策略类A
public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("This is ConcreteStrategyA");
    }
}
?
// 具体策略类B
public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("This is ConcreteStrategyB");
    }
}
?
// 用户类
public class Context { 
    private Strategy strategy;
?
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
?
    public Strategy getStrategy() {
        return strategy;
    }
?
    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }
?
    // 用户方法,执行具体赋值的策略的计算方法
    public void execute() {
        System.out.println("context execute");
        strategy.execute();
    }
?
    public static void main(String[] args) {
        Context context = new Context(new ConcreteStrategyA());
        context.execute();
?
        // 可以根据输入的数据等信息进行判断,设置对应的具体策略来执行
        context.setStrategy(new ConcreteStrategyB());
        context.execute();
    }
}

 

总结

策略模式主要是找出应用中可能需要变化之处,把它们独立出来进行封装,不和那些不需要变化的代码混在一起。

这样可以独立出最小的部分来进行复用,避免了有很多的将易变和不变部分混合在一起的实现类,导致出现重复代码的情况。

同时策略模式符合开-闭原则,对扩展开发,对修改关闭,当有新的策略出现的时候,只要添加一个对应的继承策略接口的具体类即可,不需修改其他策略。

 

策略模式笔记