[设计模式]Strategy Pattern(策略模式).(1)
来源:互联网 发布:淘宝退款选项 编辑:程序博客网 时间:2024/05/14 05:00
《Head FIrst 设计模式》的读书笔记
StrategyPattern
策略模式
学过面向对象的都知道继承可以重用父类中的一些方法,从而减少很多劳动量:
现在场景如下:
玩具工厂生产各种鸭子
有优雅鸭子(ElegantDuck),爵士鸭子(DukeDuck),霸王鸭子(KingDuck),均继承自超类鸭子(Duck),他们都是可以飞行的,并且在飞行时执行统一的方法 Fly() —— 喊叫"I'm flying."
//pic
于是优雅、爵士和霸王顺理成章地继承了超类的飞行方法
void Fly(){ 喊叫("I'm flying.");}
于是有:
class Duck//超类{ public void Fly() { Console.WriteLine("I'm flying"); }}//class Duckclass ElegantDuck: Duck{}class DukeDuck: Duck{}class KingDuck: Duck{}应用了面向对象之后一切看起来都是那么的优美,没有重复的代码,整洁如新。
不久之后,为了适应低龄儿童,玩具工厂决定加入新的花样——橡皮鸭子(RubberDuck),但是这种橡皮鸭子是不能飞行的,当被调用方法Fly()时会输出"I can't fly!"
于是顺理成章地我们可以重写(override)超类中的Fly()方法,于是有橡皮鸭子:
class RubberDuck: Duck{ public void override Fly()//重写超类中的Fly() { 尖叫("I can't fly!"); }}一切看起来顺理成章。
可是最后,出现了一件可怕的事情。
自玩具工厂推出面向低龄儿童的玩具之后受到社会各界的广泛好评,销售量大增,于是高层决定打铁成热推出几款新的产品——木头鸭子(WoodDuck), 塑料鸭子(PlasticDuck),这两款鸭子都不能飞行,将和橡皮鸭子执行同样的飞行方法。
难题出现了:难道这时我必须重写这3个不会飞的鸭子类中的Fly()方法???这样太不优美了吧!!!光是想起来就让人觉得丑陋啊!
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
解决方案:
将飞行这个行为不再单纯地看作是Duck的方法,而是将Fly()看成是Duck的行为属性的表现方式。光看文字太抽象了,用代码表示大概就是
class Duck { FlyBehavior flyBehavior;//属性,FlyBehavoir 是飞行行为的接口,子类可以在各自的构造函数或者别的什么地方指定对应的飞行行为 public void Fly() { flyBehavior.Fly();//属性的具体表现方式 } }
这样就将FlyBehavior和Duck组合在了一起。
于是全新的鸭子系列闪亮出炉了!
//飞行行为: interface IFlyBehavoir { void Fly(); } class Flyable : IFlyBehavoir//能飞的 { void IFlyBehavoir.Fly() { Console.WriteLine("I'm flying"); } } class UnFlyable:IFlyBehavoir//不能飞的 { void IFlyBehavoir.Fly() { Console.WriteLine("I can't fly!"); } } //鸭子系类 class Duck//超类 { protected IFlyBehavoir flyBehavoir; public void Fly() { flyBehavoir.Fly(); } }//class Duck class ElegantDuck : Duck { public ElegantDuck() { //绑定具体的飞行行为 this.flyBehavoir = new Flyable();//其实这里我一直搞不懂到底是该用base还是this... } } class DukeDuck : Duck { public DukeDuck() { this.flyBehavoir = new Flyable(); } } class KingDuck : Duck { public KingDuck() { this.flyBehavoir = new Flyable(); } } class RubberDuck : Duck { public RubberDuck() { this.flyBehavoir = new UnFlyable(); } } class WoodDuck : Duck { public WoodDuck() { this.flyBehavoir = new UnFlyable(); } } class PlasticDuck : Duck { public PlasticDuck() { this.flyBehavoir = new UnFlyable(); } }
- [设计模式]Strategy Pattern(策略模式).(1)
- 设计模式 - Strategy Pattern(策略模式)
- 设计模式 - Strategy Pattern(策略模式)
- 设计模式20:Strategy Pattern (策略模式)
- 设计模式-策略模式(Strategy Pattern)
- 设计模式:策略模式 strategy pattern
- java设计模式---Strategy Pattern---策略模式
- 设计模式之策略模式(Strategy Pattern)
- 设计模式-策略模式(Strategy Pattern)
- c++设计模式:策略模式(Strategy Pattern)
- 设计模式学习--策略模式(Strategy Pattern)
- 设计模式原来如此-策略模式(Strategy Pattern)
- 设计模式-策略模式 Strategy Pattern
- 设计模式 - 策略模式(Strategy Pattern) 详解
- 设计模式 - 策略模式(Strategy Pattern) 详解
- 设计模式心得:策略模式 (strategy pattern)
- 设计模式-策略模式(strategy pattern)
- 设计模式学习--策略模式(Strategy Pattern)
- 第七周实验报告1
- flex meun 使用
- Process Resources
- hdoj 3667 Transportation
- Fedora14下编译qtopia问题
- [设计模式]Strategy Pattern(策略模式).(1)
- 整理了独立博客大全导航地址分享给大家
- 安装mongo的python脚本插件
- Java概述
- 在xp上用vs2008编译zlib1.2.5
- 随笔
- ECSHOP模板中用mod方法替代is div by方法来判断是否整除
- 第七周作业1
- ubuntu 11.10 安装 dss