设计模式学习总结-策略模式

定义

它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。

解析

  1. 策略模式中体现了两个非常基本的面向对象设计的基本原则:封装变化的概念;编程中使用接口,而不是对接口实现。
  2. 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系(聚集)。弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
  3. 同时策略模式还体现了开放封闭原则:对扩展开放,对修改封闭。

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();
       }
}

补充说明

  1. 客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。
  2. 策略模式造成许多的策略类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。

Leave a Comment.