策略模式学习1:
从简单的模拟鸭子应用做起:
SimUDuck.游戏中会出现各种鸭子,一边游泳,一边呱呱叫。
首先通常的设计,设计一个鸭子超类,所有的鸭子都会呱呱叫,也会游泳,由超类负责处理这部分的行为实现代码。
代码分别如下:
这是一个鸭子超类
public abstract class Duck { public void quack() { System.out.PRintln("呱呱叫..."); } public void swim() { System.out.println("游来游去..."); } abstract void display();// 每种鸭子的外观更不同,所以设定为抽象的 /* * 某一天需求变了,某些鸭子要会飞。 * 因此设计想到在超类中加入了这个方法,那么所有的鸭子都具备了会飞的行为。 */ void fly(){ System.out.println("飞来飞去..."); } //鸭子的其他方法}鸭子子类们:/** * 绿头鸭 * @author Administrator * */public class MallardDuck extends Duck { @Override void display() { System.out.println("绿头鸭.."); }}/** * 红头鸭 * @author Administrator * */public class RedheadDuck extends Duck { @Override void display() { System.out.println("红头鸭..."); }}/** * 橡皮鸭 * @author Administrator * */public class RubberDuck extends Duck { @Override void display() { System.out.println("橡皮鸭..."); } /* * 橡皮鸭子不会呱呱叫 * 但是问题来了,这个橡皮鸭子会飞? * 那设计人员会说:一样覆盖掉就好 */ @Override public void quack() { //覆盖超类的呱呱叫 System.out.println("吱吱叫..."); } @Override void fly() { //覆盖,变成什么事儿都不做 ; } }这样设计就是最通常的设计了,如果需求不变,那这样设计就没有什么缺点了。
新闻热点
疑难解答