设计模式------策略模式
我认为核心思想是:把变化的方法也当作参数传过来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(){ ..... } }); } }