设计模式------策略模式

[code]
我认为核心思想是:把变化的方法也当作参数传过来

1.语义:策略模式 : 所谓策略就是有不同的方法,不同的方式,或者说是不同的算法,但这些策略可能都是为了实现一种应用,比如公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图,这是两种不同的途径来表达同一个东西,那么可能会根据不同的需要灵活的选择其中的一种来用,所以这两种策略就可以把他们变成接口的实现,用接口就可以了。。。
2.又比如鸭子的飞行方式(head first中的例子),有的鸭子这样飞,有的那样飞,所以飞的策略是不一样的,但是都可以飞嘛。。所以飞是可变动的,飞就要变成接口。。。。

3. 用张孝祥的话说:你想干什么事,我就传一段代码给你,这段代码能帮你干,那么怎么传一段代码啊,因为不能把一段代码传给一个方法,所以我们把代码封装到一个对象里面,然后我把那个对象传递给你,以后你调用那个对象的那个方法就可以了


策略模式的做法和命令模式一样,他解决的问题与模板方法一样。。。。

//下面把模板方法改成策略模式
先上模板方法
public abstract class CaffeineBeverage{
3. final void prepareRecipe(){
4. boilWater(); //固定的
5. brew(); //抽象的-----可以更加子类定制
6. pourInCup(); //固定的
7. addCondiments(); //抽象的
8. }
9.
10. abstract void brew(); //缺点是子类只能有一个brew(),如果子类要更加不同情况来生成不同brew,那么这种方法就没用了
11. abstract void addCondiments();
12.
13. void boilWater(){
14. //实现
15. }
16.
17. void pourInCup(){
18. //实现
19. }
20.}

上面体现出了子类要用到它必须继承的坏处

我们应该把变化的部分通过参数的形式传进来
public class CaffeineBeverage{
3. final void prepareRecipe(PrepareReciper pr){
4. boilWater(); //固定的
5. pr.brew(); //抽象的-----可以更加子类定制
6. pourInCup(); //固定的
7. pr.addCondiments(); //抽象的
8. }
9.
12.
13. void boilWater(){
14. //实现
15. }
16.
17. void pourInCup(){
18. //实现
19. }
20.}

下面是使用这个模板的类
public class Cooker{
CaffeineBeverage cb = new CaffeineBeverage();
if(cooker.equals("zhangsan")){ //根据不同的策略来传递方法体
cb.prepareRecipe(new PrepareReciper(){
void brew(){
.....
}
void addCondiments(){
.....
}
});
}else {
cb.prepareRecipe(new PrepareReciper(){
void brew(){
.....
}
void addCondiments(){
.....
}
});

}

}

[/code]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值