设计模式—策略模式

今天阅读《Head First设计模式》中讲到的第一个设计模式:策略模式。

策略模式定义了一个算法族,分别封装起来,让他们之间可以相互替换;此模式让算法的变化独立于客户。

书中的例子是设计一个“鸭子模拟器”,用来模拟各种鸭子:橡皮鸭,绿头鸭,红头鸭……

设计方案如下:将各种鸭子“共同的东西”(不变的部分)封装在一个鸭子类Duck,所有的鸭子都要继承这个类。此外将变化的部分提取出来,设计成接口,比如说Fly设计成接口,然后有一系列的Fly的实现(LowFly,HighFly……)。

将Fly接口类型的变量封装在Duck类中,这样每一个继承Duck的鸭子子类就会拥有一个Fly成员,这样就可以委托Fly成员实现“fly行为”。每个Duck的鸭子子类在实现时可以设置不同的Fly实现类,从而实现不同的"fly行为"。

 

实现伪代码如下:

 

class Duck { public Fly fly;//Fly接口 public void displayFly() { fly.fly();//委托fly实现fly行为 } } //Fly接口 interface Fly { public void fly(); } //Fly实现类 class LowFly implement Fly { public void fly() { System.out.println("low fly"); } } class HighFly implement Fly { public void fly() { System.out.println("High fly"); } } //Duck子类 class LowFlyDuck extends Duck { public LowFlyDuck() { super(); fly = new LowFly();//实际的fly行为 } } class HighFlyDuck extends Duck { public LowFlyDuck() { super(); fly = new HighFly();//实际的fly行为 } }

注:为什么不让Duck的子类直接实现Fly接口呢?此处正是“多组合,少继承”的体现,如果有100个鸭子都直接实现了Fly接口,他们必须自己实现fly()方法,那么当他们中的许多要改变fly行为时,就要修改fly()方法中的代码。但是,如上述代码,利用组合,则可以动态改变fly行为,只需要添加set方法,设置不同的Fly的实现类即可。

 

你可能感兴趣的:(设计模式,算法,Class,interface)