策略模式

按着自己的计划,终于要学习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]

[color=red]这就是3中不同的策略都用在了处理一种字符串上[/color],如果方法

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与我交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值