设计模式学习总结-策略模式
定义
它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
解析
- 策略模式中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。
- 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系(聚集)。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
- 同时策略模式还体现了开放封闭原则:对扩展开放,对修改封闭。
UML图
代码示例
// 定义了所有支持的算法的公共接口 public interface Strategy { public void AlgrithmInterface(); } // 封装了具体的算法,实现了Strategy接口 public class ConcreteStrategyA implements Strategy { public void AlgrithmInterface() { System.out.println("ConcreteStrategyA.AlgrithmInterface"); } } public class ConcreteStrategyB implements Strategy { public void AlgrithmInterface() { System.out.println("ConcreteStrategyB.AlgrithmInterface"); } } // 用一个上下文做配置,维护一个对Strategy对象的引用 public class Context { private Strategy stg; public Context(Strategy theStg) { this.stg = theStg; } public void DoAction() { this.stg.AlgrithmInterface(); } } // 客户端调用 public class Client { public static void main(String[] args) { Strategy stgA = new ConcreteStrategyA(); Context ct = new Context(stgA); ct.DoAction(); } } |
补充说明
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
- 策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。