[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]
我认为核心思想是:把变化的方法也当作参数传过来
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]