#策略者模式
* 一个对象有多种行为(多种选择),并且在运行时还可以改变对象的状态
eg:一个鸭子有很多种飞行分方式,有很多种 叫 的方式,将飞行和叫从鸭子中单独分离出来,然后叫和飞也有很多种不同的形式。 选择其中的任何一种方式,也可以看作是一种策略模式。
public abstract class Duck {
//使用 其对象
protected FlyBehavior flyBehavior;
protected QuackBehavior quickBehavior;
//飞的形式
public void performFly() {
flyBehavior.fly();
}
//叫的形式'
public void perormQuack() {
quickBehavior.quick();
}
public void swim() {
System.out.println("鸭子游泳");
}
abstract void display();
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuickBehavior() {
return quickBehavior;
}
public void setQuickBehavior(QuackBehavior quickBehavior) {
this.quickBehavior = quickBehavior;
}
}
- 定义叫和飞的形式
interface FlyBehavior {
public void fly();
}
- 叫的方式
interface QuackBehavior {
public void quick();
}
class Quack implements QuackBehavior {
@Override
public void quick() {
System.out.println("嘎嘎叫");
}
}
class SlientQuack implements QuackBehavior {
@Override
public void quick() {
System.out.println("沉默的叫");
}
}
class QuickFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("快速的飞");
}
}
class SingleFly implements FlyBehavior {
@Override
public void fly() {
System.out.println("一只翅膀飞");
}
}
- 定义鸭子的实现类
class WaterDuck extends Duck {
public WaterDuck() {
this.flyBehavior = new QuickFly();
this.quickBehavior = new Quack();
}
@Override
void display() {
System.out.println("I am waterDuck");
}
}
class WoddenDuck extends Duck {
public WoddenDuck() {
this.flyBehavior = new SingleFly();
this.quickBehavior = new SlientQuack();
}
@Override
void display() {
System.out.println("i ma a wodden duck");
}
}
- 在运行时也可以改变其状态
public static void main(String[] args) {
WaterDuck waterDuck = new WaterDuck();
waterDuck.performFly();
//运行时可以替换对象
waterDuck.setQuickBehavior(new SlientQuack());
waterDuck.perormQuack();
waterDuck.display();
waterDuck.swim();
}