代码改变世界

设计模式——策略模式(Strategy Pattern)

  雪夜&流星  阅读(287)  评论(0编辑  收藏  举报

  写在前面:

   直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉。

  UML图:

  

 

  抽象策略:Strategy   

复制代码
package com.cnblog.clarck;

/**
 * 抽象策略
 * 
 * @author clarck
 * 
 */
public abstract class Strategy {
    /**
     * 抽象的算法方法
     */
    public abstract void algorithmInterface();
}
复制代码

  具体算法A:ConcreateStrategyA

复制代码
package com.cnblog.clarck;

/**
 * 具体算A
 * 
 * @author clarck
 * 
 */
public class ConcreateStrategyA extends Strategy {
    /**
     * 算法A的方法具体实现
     */
    @Override
    public void algorithmInterface() {
        System.out.println("algorithm A implements !");
    }

}
复制代码

具体算法B:ConcreateStrategyB

复制代码
package com.cnblog.clarck;

/**
 * 具体算法B
 * 
 * @author clarck
 * 
 */
public class ConcreateStrategyB extends Strategy {
    /**
     * 具体算法B的实现
     */
    @Override
    public void algorithmInterface() {
        System.out.println("algorithm B implements !");
    }

}
复制代码

算法C的具体实现:ConcreateStrategyC

复制代码
package com.cnblog.clarck;

/**
 * 算法C的具体实现
 * 
 * @author clarck
 * 
 */
public class ConcreateStrategyC extends Strategy {

    /**
     * 算法C的方法的实现
     */
    @Override
    public void algorithmInterface() {
        System.out.println("algorithm C implements !");
    }

}
复制代码

上下文:Context

复制代码
package com.cnblog.clarck;

/**
 * 上下文
 * 
 * @author clarck
 * 
 */
public class Context {
    Strategy mStrategy;

    public Context(Strategy strategy) {
        mStrategy = strategy;
    }

    //上下文接口
    public void ContextInterface() {
        mStrategy.algorithmInterface();
    }
}
复制代码

测试例子:Test

复制代码
package com.cnblog.clarck;

/**
 * 单元测试类
 * 
 * @author clarck
 * 
 */
public class Test {
    
    public static void main(String[] args) {
        Context context;
        context = new Context(new ConcreateStrategyA());
        context.ContextInterface();
        
        context = new Context(new ConcreateStrategyB());
        context.ContextInterface();
        
        context = new Context(new ConcreateStrategyC());
        context.ContextInterface();
    }
    
}
复制代码

  摘抄总结(来源于《大话设计模式》):

    策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它都可以以相同的方式调用所有的算法,减少了各种算法与使用算法类之间的耦合。

    策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取这些算法中的公共部分。策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试

    当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择合适的行为。将这写行为封装在一个个独立的Stratgy类中,

可以在使用这些行为的类消除条件语句

    策略模式就是用来封装算法的,但在实践中,我们可以发现用它来封装几乎任何类型的规则,只要在分析过程中听到学要
在不同的时间应用不同的业务规则,就可以考虑使用策略模式来处理这种变化的可能性。

    在基本的策略模式中,选择所用具体实现的职责由客户端承担,并转给策略模式的Context对象

 

    简单工厂与策略模式的区别:
    简单工厂模式需要让客户端知道两个类,但是策略模式(Context)只需要让客户端知道一个类,让耦合性更低。

 

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示