策略模式

xiaoxiao2021-02-27  407

策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于实用算法的客户。

类图

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 设计模式

转载请注明原文地址: https://www.6miu.com/read-1422.html

最新回复(0)