zoukankan      html  css  js  c++  java
  • 设计模式:策略模式(转)

    原文出处:http://www.cnblogs.com/li-peng/archive/2013/02/18/2915594.html

    注:为了方便自己日后查阅,把原文做了些许改动。

    一、概念部分,改为参考Thinking in java 4rd

    二、代码部分,改为java例子。

    =======================================================================

    策略模式:创建一个能够根据所传递的参数对象的不同而具有不同行为的方法。

              这类方法包含所要执行的算法中固定不变的部分,而“策略”包含变化的部分。“策略”就是传递进去的参数对象,它包含要执行的代码。(参考thinking in java 4rd)

    定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

    换句话说策略模式,是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,比如吃东西的行为,有的人喜欢狼吞虎咽,有的人

    喜欢细嚼慢咽,有的人喜欢边吃边说

    策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。

     看一下简单的代码实现

    package interfaces.classprocessor;
    
    import java.util.Arrays;
    
    class Processor{
        public String name(){
            return getClass().getSimpleName();
        }
        Object process(Object input){return input;}
    }
    class Upcase extends Processor{
        String process(Object input){return ((String)input).toUpperCase();}
    }
    class Downcase extends Processor{
        String process(Object input){return ((String)input).toLowerCase();}
    }
    class Splitter extends Processor{
        String process(Object input){return Arrays.toString(((String)input).split(" ")); }
    }
    
    public class Apply {
        public static void process(Processor p, Object s){
            System.out.println("Use Processor:"+p.name());
            System.out.println(p.process(s));
        }
        public static String s="Disgreement with beliefs is by definition incorrent";
        public static void main(String[] args){
            process(new Downcase(),s);
            process(new Upcase(),s);
            process(new Splitter(),s);
        }
    }

    输出:

    Use Processor:Downcase
    disgreement with beliefs is by definition incorrent
    Use Processor:Upcase
    DISGREEMENT WITH BELIEFS IS BY DEFINITION INCORRENT
    Use Processor:Splitter
    [Disgreement, with, beliefs, is, by, definition, incorrent]

    策略模式的优点: 
        1.提供了管理相关算法族的方法。 
        2.可以避免使用多重条件转移语句。 
        缺点: 
        3.必须知道所有的具体策略类及它们的区别. 
        4.生成许多的策略类。

  • 相关阅读:
    再收藏一篇: oracle批量绑定 forall bulk collect用法以及测试案例
    Dll中导出导入时巧用条件编译指令共享头文件
    Oracle不支持在select语句中调用自定义函数时使用自定义类型作参数?
    (Alan Murta)编制的多边形集合运算软件包(general polygon clipping library,简称GPC)
    MSDN:CFile和CStdioFile区别以及CString中的'\r\n'
    REF CURSOR 小结
    Oracle存储过程中执行DDL操作
    Oracle在存储过程中,如何删除和创建表?
    收藏:关于表名也动态的动态SQL文章
    用Select查询结果创建ACCESS表
  • 原文地址:https://www.cnblogs.com/m3Lee/p/3992721.html
Copyright © 2011-2022 走看看