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


      写在前面:

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

      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)只需要让客户端知道一个类,让耦合性更低。

  • 相关阅读:
    Xen, Linux and udev
    xend的调试方法
    xenstored为什么不能重启?
    [转]xen虚拟windows使用vnc桌面鼠标位置偏移现象的解决
    基于模板的代码生成器
    区分JavaScript中的undefined,null和NaN
    ExtJS+ASP.NET实现异步Tree的节点搜索和查找下一个(FindNext)
    ExtJS+ASP.NET实现Tree节点的拖动(DragDrop)
    ExtJS+ASP.NET实现真实的进度条显示服务器端长时间操作的进度
    说说企业架构(企业级架构)和应用程序架构
  • 原文地址:https://www.cnblogs.com/tanlon/p/3381706.html
Copyright © 2020-2023  润新知