论坛首页 Java企业应用论坛

策略模式

浏览 2184 次
锁定老帖子 主题:策略模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-20   最后修改:2008-12-25
   按着自己的计划,终于要学习spring了,在网上看了看,学习spring,要精通,要掌握其精髓,就要理解2种设计模式,工厂模式和策略模式。
   先说说策略把,我觉得比工厂好理解。
  
interface Processor {
    String name();

    Object process(Object input);
}

class StringProcessor implements Processor {

    public String name() {
        return getClass().getSimpleName();
    }

    public Object process(Object input) {
        return input;
    }
}

class Upcase extends StringProcessor {
    public String process(Object input) {
        return ((String) input).toUpperCase();
    }
}

class LowerCase extends StringProcessor {
    public String process(Object input) {
        return ((String) input).toLowerCase();
    }
}

class Spliter extends StringProcessor {
    public String process(Object input) {
        return Arrays.toString(((String) input).split(" "));
    }
}

public class Apply {
    public static void process(Processor p, Object input) {
        System.out.println("使用的策略是 " + p.name());
        System.out.println(p.process(input));
    }

    public static void main(String[] args) {
        String s = "sds HGfhj dsfsDF fdgf ssDD";
        process(new Upcase(), s);
        process(new LowerCase(), s);
        process(new Spliter(), s);
    }
}

打印出的结果是:
使用的策略是 Upcase
SDS HGFHJ DSFSDF FDGF SSDD
使用的策略是 LowerCase
sds hgfhj dsfsdf fdgf ssdd
使用的策略是 Spliter
[sds, HGfhj, dsfsDF, fdgf, ssDD]

这就是3中不同的策略都用在了处理一种字符串上,如果方法
 public static void process(Processor p, Object input) {
        System.out.println("使用的策略是 " + p.name());
        System.out.println(p.process(input));
    }
是一段及其复杂的代码段,那么就可以很好的起到重用的效果,开闭原则:扩展开放,更改关闭很好的体现了出来。如果有新的策略,比如让字符串反序输出的策略,源代码完全不用更改,直接扩展新的类就可以了。

    策略模式的主要思想还是java的很多基础概念的综合运用,其实就是万变不离其宗,刚开始看Apply中的process方法会有点疑惑,p是接口的引用,根本还未指向任何实际的对象,怎么能调用name()方法和process方法呢,这两个是抽象的啊。

    java是一种强类型检查的语言,无时无刻都在检查着你的类项是否正确,在编译阶段,java发现引用p的类型是Processor ,而name()方法和process方法确实是Processor类中为对象所定义的方法,这就够了,这就已经符合了编译器的要求,而在真正的运行期,java的多态和后期绑定就来了,而且帮你自动完成,执行程序的时候,java才会去看,p真正引用的对象是谁,那么就调用这个对象的方法,所以反射机制也能正确的显示出正在被加载的策略的正确的名称。

    这也很好的体现出了面向接口编程,Processor p 就是接口引用,如果它设计好了,你的代码就可以操控它和它的所有实现类了,所以我们的代码要面向接口编程,参数是接口化的,而不是对着接口的某300种实现在写程序,只要对着接口引用写就行了,后面的多态和后期绑定,java会自己帮我们完成的。

-------------------------------------------------
开源才是王道
代码出自:thinking in java
我的MSN:fatcatyycom@hotmail.com与我交流。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics