《HeadFrist 设计模式》读书笔记 —— 策略模式
来源:互联网 发布:淘宝大学的vip课靠谱吗 编辑:程序博客网 时间:2024/06/06 00:01
《HeadFrist 设计模式》读书笔记 —— 策略模式
出现情形:
定义了一个父类鸭子,定义的有叫,游方法,子类有:活鸭子,玩具鸭子等,这时想在父类鸭子中加上飞这个操作,这时会出现情况,活鸭子可以实现叫,飞,游方法,但是玩具鸭子只能实现叫,游,并不能飞。
思路进程:
1.利用继承:直接在父类中加上fly()方法,这样需要在不同的子类中覆盖fly方法,活鸭子就可以飞,但是玩具鸭就不能飞。
缺点:
1)加个方法就需要在所有的子类中改变。
2)代码在子类中重复。不能飞的话,不能飞的子类都需要实现不能飞操作。
3)运行时的行为不容易改变。
4)很难知道所有鸭子的全部行为。
2.利用接口:将fly方法定义成接口,能飞的就实现这个接口的fly方法。
缺点:
子类需要重复实现接口方法。(1000个子类都需要实现一遍fly()方法,但是fly仅仅fly。。)
类图:
可以看到,对于易变的fly和quack行为,抽出来以接口的形式定义,不同的fly方式和quack方式实现接口里的fly方法和quack方法,而Duck对象以组合的形式持有FlyBehavior和QuackBehavior接口,分别在performFly方法和performQuack方法中调用FlyBehavior.fly和QuackBehavior.quack方法。这样在不同的Duck类型中,可以动态的设置不同的fly和quack类型,但是调用的都是同样的performFly和performQuack方法。
代码实现:
父类Duck
public abstract class Duck { FlyBehavior mFlyBehavior; QuackBehavior mQuackBehavior; public abstract void display(); public abstract void swim(); public void performFly() { mFlyBehavior.fly(); } public void performQuack() { mQuackBehavior.quack(); } public void setmFlyBehavior(FlyBehavior mFlyBehavior) { this.mFlyBehavior = mFlyBehavior; } public void setmQuackBehavior(QuackBehavior mQuackBehavior) { this.mQuackBehavior = mQuackBehavior; } }
FlyBehavior
public interface FlyBehavior { public void fly(); }
PlaneFly-飞的像飞机一样快
public class PlaneFly implements FlyBehavior { @Override public void fly() { Log.i("TAG", "fly by plane"); } }
RocketFly-飞的像火箭一样快
public class RocketFly implements FlyBehavior { @Override public void fly() { Log.i("TAG", "fly by rocket"); } }
QuackBehavior
public interface QuackBehavior { public void quack(); }
BigQuack - 大声叫
public class BigQuack implements QuackBehavior { @Override public void quack() { Log.i("TAG", "Quack is big"); } }
SmallQuack-小声叫
public class SmallQuack implements QuackBehavior { @Override public void quack() { Log.i("TAG", "quack is small"); } }
StrategyActivity
public class StrategyActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.strategy_main); TopDuck topDuck = new TopDuck(); test(topDuck,new RocketFly(),new BigQuack()); SmallDuck smallDuck = new SmallDuck(); test(smallDuck,new PlaneFly(),new SmallQuack()); } private void test(Duck duck, FlyBehavior flyBehavior, QuackBehavior quackBehavior) { duck.display(); duck.swim(); duck.setmFlyBehavior(flyBehavior); duck.setmQuackBehavior(quackBehavior); duck.performFly(); duck.performQuack(); } }
待续…(对设计模式更深入理解后)
- 《HeadFrist 设计模式》读书笔记 —— 策略模式
- 《读书笔记》设计模式——策略模式
- HeadFrist设计模式学习之外观模式
- HeadFrist设计模式学习之适配器模式
- HeadFrist设计模式学习之迭代器模式
- HeadFrist设计模式学习之状态模式
- "Head First 设计模式"读书笔记——策略模式
- 《Head First设计模式》读书笔记1——策略模式
- 读书笔记1:Head First设计模式——策略模式
- 《设计模式》读书笔记:策略模式
- 设计模式读书笔记-----策略模式
- 设计模式读书笔记--策略模式
- 设计模式读书笔记-----策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 设计模式—策略模式
- 自定义数据类型/结构体(struct)、typedef
- activity波纹效果切换界面
- BOM
- 2.Vim编辑器
- Ubuntu下彻底卸载MySQL
- 《HeadFrist 设计模式》读书笔记 —— 策略模式
- 第十章 导航控制器及场景转换
- krpano 安装 新手教程
- Supermarket POJ
- 在Ecplise里面导入Myecplise Web工程
- QTableWidget单元格自动分行显示
- JQuery 导航
- poj-3067-japan--(树状数组)
- 51nod 1799 二分答案 思维 + 分块打表