定义:定义算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
代码:
定义算法族(超类或接口及其若干实现类)
public interface FlyBehavior {
void fly();
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("I'm flying!!!");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("I can't fly!");
}
}
定义客户端(其内部拥有委托类的引用,以及设置委托类的方法)
public abstract class Duck {
// 委托类(超类或接口)
FlyBehavior flyBehavior;
public Duck() {}
public abstract void display();
// 核心:FlyBehavior可被替换
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
// 委托
public void performFly() {
flyBehavior.fly();
}
public void swim() {
System.out.println("All ducks float, enen decoys!");
}
}
public class MallardDuck extends Duck {
public MallardDuck() {
super.flyBehavior = new FlyWithWings();
}
@Override
public void display() {
System.out.println("I'm a real Mallard duck!");
}
}
测试:
public class Test {
public static void main(String[] args) {
Duck duck = new MallardDuck();
// 使用默认的委托类
duck.performFly();
// 动态替换委托类
duck.setFlyBehavior(new FlyNoWay());
duck.performFly();
}
}
结果:
I'm flying!!!
I can't fly!