在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。
例如,有一个鸭子类,但是每个鸭子的飞行方法都不一样,所以需要把飞行行为设计成一个接口,然后根据不同的鸭子选择不同的实现。
//鸭子的超类设计
public abstract class Duck {
private FlyBehavior flyBehavior;
//设置飞行模式
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
//表演飞行
public void performFly() {
flyBehavior.fly();
}
//展示鸭子类型
public abstract void show();
}
//飞行行为的接口设计
public interface FlyBehavior {
void fly();
}
//飞行方法的第一种实现,飞不动
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 MarllardDuck extends Duck {
public MarllardDuck() {
super();
setFlyBehavior(new FlyWithWings());
}
@Override
public void show() {
System.out.println("这是绿头鸭");
}
}
//测试绿头鸭的方法
@Test
public void method(){
Duck duck = new MarllardDuck();
duck.show(); //这是绿头鸭
duck.performFly(); //带着翅膀飞翔
}