策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
案例:有一群不同种类的鸭子,它们的飞行行为各有不同。这里的飞行行为相当于算法族,可以独立变化。
代码(策略模式 + 组合):
飞行行为
public interface FlyBehavior {
public void performFly();
}
class FlyWithWings implements FlyBehavior {
@Override
public void performFly() {
System.out.println("I am flying!!");
}
}
class FlyNoWay implements FlyBehavior {
@Override
public void performFly() {
System.out.println("I can't fly");
}
}
鸭子类
public abstract class Duck {
FlyBehavior flyBehavior;
abstract void display();
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void performFly() {
flyBehavior.performFly();
}
}
class YellowDuck extends Duck {
public YellowDuck() {
flyBehavior = new FlyWithWings();
}
@Override
void display() {
System.out.println("我是一只小黄鸭");
}
}
class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
}
@Override
void display() {
System.out.println("我是一个模型鸭");
}
}
测试:
public class Test {
public static void main(String[] args) {
Duck duck = new YellowDuck();
duck.display();
duck.performFly();
Duck duck1 = new ModelDuck();
duck1.display();
duck1.performFly();
duck.setFlyBehavior(new FlyNoWay());
duck.display();
duck.performFly();
}
}
结果:
我是一只小黄鸭
I am flying!!
我是一个模型鸭
I can't fly
我是一只小黄鸭
I can't fly