策略模式-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 @   diameter  阅读(130)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示