图一:
图二:
鸭子对象,会游泳、会叫、会飞(变天鹅之后),但不是所有的鸭子都能飞(当它还是丑小鸭的时候),初步设计如图一。
这并不是一个复用性好的设计,有更好的解决方案(图二)。
原则是:
1.找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起;
2.针对接口编程;
3.多用组合少用继承;
图二就是最简单的策略模式(Strategy Pattern):
定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
/** * 抽象鸭子父类 * @author Administrator * */ public abstract class Duck { FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){} public abstract void display(); public void perfectFly(){ flyBehavior.fly(); } public void perfectQuack(){ quackBehavior.quack(); } public void swim(){ System.out.println("swimming!! now!!!"); } public void setFlyBehavior(FlyBehavior fly){ this.flyBehavior = fly; } public void setQuackBehavior(QuackBehavior quack){ this.quackBehavior = quack; } }
/** * 飞行行为接口 * @author wengn * */ public interface FlyBehavior { //飞行方法 public void fly(); }
/** * 飞行行为的具体实现 * @author wengn * */ public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("I can fly with wing!!!"); } }
/** * 子类鸭子 * @author wengn * */ public class MallardDuck extends Duck { public MallardDuck(){ } @Override public void display() { System.out.println("I am a real Mallard duck!!"); } }
/** * 测试类 * @author wengn * */ public class Test { public static void main(String[] args) { Duck mallard = new MallardDuck(); mallard.setFlyBehavior(new FlyWithWings()); mallard.perfectFly(); } }