策略模式-Strategy

名称:

    策略模式(Strategy Pattern)-对象行为模式

 

问题:

     The intent of the Strategy Pattern is to define a family of algorithms, encapsulate each algorithm, and make them interchangeable. The Strategy Pattern lets the algorithm vary independently from clients that use it. In addition the pattern, defines a group of classes that represent a set of possible behaviors. These behaviors can then be used in an application to change its functionality.

     定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

 

适用性:

    -许多相关的类仅仅是行为有异。

    -需要使用一个算法的不同变体。

    -算法使用客户不应该知道的数据。

    -一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

 

协作:

    -Strategy和Context相互作用以实现选定的算法。当算法被调用时,Context可以将该算法所需要的所有数据都传递给该Stategy。或者,Context可以将自身作为一个参数传递给Strategy操作。这就让Strategy在需要时可以回调Context。

    -Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrtegy对象给该Context;这样,客户仅与Context交互。通常有一系列的ConcreteSrategy类可供客户从中选择。

 

优点和缺点:

    1、相关算法系列。

    2、一个替代继承的方法。

    3、消除了一些条件语句。

    4、实现的选择。

    5、客户必须了解不同的Strategy。

    6、Strategy和Context之间的通信开销。

    7、增加了对象的数目。

解决方案:

    

1、 模式的参与者

    1、Strategy

    -定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。

    2、ConcreteStrategy

    -以Strategy接口实现某具体算法。

    3、ConText

    -用一个ConcreteStrategy对象来配置。

    -维护一个对Strategy对象的引用。

    -可定义一个接口来让Strategy访问它的数据。

 

2.实现方式

interface Strategy
{   
    public void method();   
}
class ConcreteStrategyA implements Strategy
{
    public void method()
    {
        System.out.println("A method!");
    }
}
class ConcreteStrategyB implements Strategy
{
  public void method()
  {
      System.out.println("B method");
  }
}
class Context
{
    private Strategy strategy;
    public Strategy getStrategy()
    {
        return strategy;
    }
    public void setStrategy(Strategy strategy)
    {
        this.strategy=strategy;
    }
    public void method()
    {
        strategy.method();
    }
}

 

参考资料

《设计模式:可复用面向对象软件的基础》

posted @ 2020-06-28 18:47  diameter  阅读(127)  评论(0编辑  收藏  举报