设计模式之一策略模式
图一:
?图二:
?
?? 鸭子对象,会游泳、会叫、会飞(变天鹅之后),但不是所有的鸭子都能飞(当它还是丑小鸭的时候),初步设计如图一。
?
? 这并不是一个复用性好的设计,有更好的解决方案(图二)。
?
? 原则是:
?
? 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(){}@Overridepublic 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();}}?