浏览 2185 次
锁定老帖子 主题:策略模式
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-20
最后修改:2008-12-25
先说说策略把,我觉得比工厂好理解。 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与我交流。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |