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