定义了算法族,分别封装起来,让它们之间可以互相替换
抽象策略类
//飞行
public interface FlyBehavior {
void fly();
}
//叫声
public interface QuackBehavior {
void quark();
}
具体策略
public class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("鸭鸭不会飞");
}
}
public class FlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("芜湖起飞!");
}
}
public class Quack implements QuackBehavior {
@Override
public void quark() {
System.out.println("嘎嘎嘎");
}
}
public class Zizi implements QuackBehavior {
@Override
public void quark() {
System.out.println("吱吱吱");
}
}
鸭子 - 超类
public abstract class Duck {
//飞行
FlyBehavior flyBehavior;
//叫声
QuackBehavior quackBehavior;
/**
* 每一种鸭子外观不同,所以是抽象方法,由子类去实现如何展示外观
*/
public abstract void display();
/**
* 所有鸭子都会游泳,所以由超类实现这部分代码
*/
public void swim() {
System.out.println("开始游泳");
}
/**
* 不是所有鸭子都会飞,委托给飞行类
*/
public void preformFly() {
flyBehavior.fly();
}
/**
* 不是所有鸭子都会叫,委托给叫声类
*/
public void preformQuack() {
quackBehavior.quark();
}
/**
* set 方法方便子类动态设定行为
* @param flyBehavior
*/
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
玩具鸭
public class ToyDuck extends Duck {
/**
* 重写超类的无参构造器,设置具体行为
*/
public ToyDuck() {
//玩具鸭不会飞
flyBehavior = new FlyNoWay();
//玩具鸭吱吱叫
quackBehavior = new Zizi();
}
@Override
public void display() {
System.out.println("是一只黄色的玩具橡皮鸭");
}
}
测试类
public class DuckDemo {
public static void main(String[] args) {
Duck toyDuck = new ToyDuck();
toyDuck.display();
toyDuck.swim();
toyDuck.preformFly();
toyDuck.preformQuack();
//改变鸭子的飞行行为
toyDuck.setFlyBehavior(new FlyWithWings());
toyDuck.preformFly();
//改变鸭子的叫声行为
toyDuck.setQuackBehavior(new Quack());
toyDuck.preformQuack();
}
}