一天一种JAVA设计模式之十三:策略模式

508 阅读3分钟

写在前面的话

复习、总结23种设计模式

获取详细源码请点击我

上一篇

# 一天一种JAVA设计模式之十二:享元模式

策略模式(政策模式)

记重点

定义

将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用

策略模式的通用类图

image.png

策略模式的三个角色

Context封装角色

它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。

package com.design.pattern.strategy.test01;  
  
public class Context {  
  
    Strategy strategy;  

    public Context(Strategy strategy) {  
        this.strategy = strategy;  
    }  

    public void doAnything() {  
        strategy.doSomething();  
    }  
}

Strategy抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。各位看官可能要问了,类图中的AlgorithmInterface是什么意思,嘿嘿,algorithm是“运算法则”的意思,结合起来意思就明白了吧。

package com.design.pattern.strategy.test01;  
  
public interface Strategy {  
    void doSomething();  
}

ConcreteStrategy具体策略角色

实现抽象策略中的操作,请该类含有具体的算法

package com.design.pattern.strategy.test01;  
  
public class ConcreteStrategy1 implements Strategy{  
  
    @Override  
    public void doSomething() {  
        System.out.println("strategy 1");  
    }  
}

优缺点

优点

  1. 策略类之间相互独立,易于扩展和维护。
  2. 可以在运行时动态切换策略,灵活性高。
  3. 提供了一种可替代继承的方案,避免继承层次的臃肿。

缺点

  1. 客户端需要了解不同的策略类,增加了使用的复杂度。
  2. 策略模式增加了类的数量,可能会导致系统更加庞大。

运用场景

策略模式适用于以下场景:

  1. 需要在不同算法之间灵活切换的情况。
  2. 有多个类似的条件语句,可以使用策略模式提取出这些条件逻辑。
  3. 需要封装一些具体的算法,使其独立于客户端而变化。

总结

策略模式是一种灵活的行为型设计模式,通过封装不同的算法成为独立的策略类,使得这些算法可以在运行时相互替换。通过定义策略接口、具体策略类和环境类,我们可以在Java中实现策略模式。该模式具有灵活性高、易于扩展和维护等优点,适用于需要动态切换算法或封装具体算法的场景。然而,策略模式也需要客户端了解不同的策略类,增加了复杂度,并可能导致系统庞大。

总而言之,策略模式是一种强大而灵活的设计模式,可以提供可复用的算法解决方案。通过合理地应用策略模式,我们可以提高代码的灵活性、可扩展性和可维护性,从而更好地应对不同的业务需求。

策略模式与模板方法模式

策略模式与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换

下一篇

# 一天一种JAVA设计模式之十二:享元模式