设计模式之策略模式
- 有很多种类的鸭子,有的鸭子可以飞,有的不能飞,有的可以叫,有的不能叫
public abstract class Duck {
// 为行为接口类型申明两个引用变量,所有鸭子子类都继承他们
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
public Duck() {
}
public void performFly() {
flyBehavior.fly();// 委托给行为类
}
public void performQuack() {
quackBehavior.quack();// 委托给行为类
}
public void swim() {
System.out.println("All ducks flaot,even decoys");
}
// 动态改变鸭子的行为
public void setFlyBEhavior(FlyBehavior fb) {
this.flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) {
this.quackBehavior = qb;
}
}
- 鸭子继承Duck
public class DuckCanFlyAndQuack extends Duck {
// 默认的鸭子可以飞和叫
public DuckCanFlyAndQuack() {
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
public static void main(String[] args) {
Duck flyAndQuackDuck = new DuckCanFlyAndQuack();
flyAndQuackDuck.performFly();
flyAndQuackDuck.performQuack();
// 设置鸭子使它不能飞
flyAndQuackDuck.setFlyBEhavior(new FlyNoWay());
flyAndQuackDuck.performFly();
}
}
public interface FlyBehavior {
//所有飞行行为类必须实现的接口
public void fly();
}
- 飞行行为实现FlyBehavior接口
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
// 会飞的鸭子的行为类别
System.out.println("flying");
}
}
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
// 不会飞的鸭子的行为类
System.out.println("can't fly");
}
}
- 呱呱叫的行为实现QuackBehavior接口
public interface QuackBehavior {
public void quack();
}
public class Quack implements QuackBehavior {
@Override
public void quack() {
// 会叫的鸭子的行为类
System.out.println("Quack");
}
}
鸭子的行为不是继承来的,是和适当的行为对象“组合”来的。
策略模式:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户