策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于实用算法的客户。
类图
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 设计模式