策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于实用算法的客户。
类图
java代码
// 飞行接口
public interface Fly {
void fly();
}
// 不会飞
public class FlyCanNot implements Fly {
@Override
public void fly() {
System.out.println("can not fly!!!");
}
}
// 用火箭飞
public class FlyWithRocket implements Fly {
@Override
public void fly() {
System.out.println("fly with rocket!!!");
}
}
// 用翅膀飞
public class FlyWithWing implements Fly {
@Override
public void fly() {
System.out.println("fly with wing!!!");
}
}
// 游泳接口
public interface Swim {
void swim();
}
// 不会游泳
public class SwimCanNot implements Swim {
@Override
public void swim() {
System.out.println("can not swim!");
}
}
// 用脚游泳
public class SwimWithFoot implements Swim {
@Override
public void swim() {
System.out.println("swim with foot!");
}
}
// 鸭子抽象类
public abstract class Duck {
protected Fly fly;
protected Swim swim;
public abstract void show();
public void fly() {
fly.fly();
}
public void swim() {
swim.swim();
}
public void setFly(Fly fly) {
this.fly = fly;
}
public void setSwim(Swim swim) {
this.swim = swim;
}
}
// 机械鸭
public class MachineDuck extends Duck {
public MachineDuck() {
fly = new FlyWithWing();
swim = new SwimWithFoot();
}
@Override
public void show() {
System.out.println("i ~ am ~ machine ~ duck ~");
}
}
// 模型鸭
public class ModelDuck extends Duck {
public ModelDuck() {
fly = new FlyCanNot();
swim = new SwimCanNot();
}
@Override
public void show() {
System.out.println("i am model duck.");
}
}
// 测试类
public class Test {
public static void main(String[] args) {
new Test().test();
}
private void test() {
ModelDuck modelDuck = new ModelDuck();
modelDuck.show();
modelDuck.fly();
modelDuck.swim();
MachineDuck machineDuck = new MachineDuck();
machineDuck.show();
machineDuck.fly();
machineDuck.swim();
machineDuck.setFly(new FlyWithRocket());
machineDuck.fly();
}
}
注:
鸭子现在将飞行和呱呱叫的动作委托别人处理,而不是使用定义在Duck类中的呱呱叫和飞行方法。
参考文章
Head First 设计模式