洞察如何选择适合你的企业的小程序开源框架来实现高效开发与管理
914
2022-11-05
设计模式——策略模式
模式介绍
策略模式(Strategy Patterm)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 这算法体现了几个设计原则, 把变化的代码从不变的代码中分离出来; 针对接口编程而不是具体类(定义了策略接口); 多用组合/聚合,少用继承(客户通过组合方式使用策略)。
UML类图
策略模式案例
背景介绍:定义一个鸭子类鸭子原本有游泳、飞翔、发声等方法,但并不是所有鸭子都会有飞翔、发声方法(如玩具鸭、诱饵鸭等)所以将飞翔和发声抽离出来做成一个抽象类,并聚合到鸭子类中使需要实现得类调用具体方法
FlyBehavior接口类类及其子类
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("我能飞翔..."); } }
Quack接口类类及其子类
public interface QuackBehavior { void quack(); }
public class Quack implements QuackBehavior{ @Override public void quack() { System.out.println("我嘎嘎叫..."); } }
public class Squeak implements QuackBehavior{ @Override public void quack() { System.out.println("鸭子吱吱叫..."); } }
public class MuteQuack implements QuackBehavior{ @Override public void quack() { System.out.println("我不会叫..."); } }
Duck抽象类及其实现子类
public abstract class Duck { // 飞行行为 protected FlyBehavior flyBehavior; // 发声行为 protected QuackBehavior quackBehavior; /** * 显示品种 */ abstract void display(); /** * 游泳 */ public void swim() { System.out.println("所有鸭子都可以游泳..."); } /** * 发声 */ public void performQuack() { if (quackBehavior != null) { quackBehavior.quack(); } } /** * 飞翔 */ public void performFly() { if (flyBehavior != null) { flyBehavior.fly(); } } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
public class MallardDuck extends Duck{ public MallardDuck() { flyBehavior = new FlyWithWings(); quackBehavior = new Squeak(); } @Override public void display() { System.out.println("我是绿头鸭..."); } }
public class RedHeadDuck extends Duck{ public RedHeadDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } @Override public void display() { System.out.println("我是红头鸭..."); } }
public class RubberDuck extends Duck{ public RubberDuck() { flyBehavior = new FlyNoWay(); quackBehavior = new MuteQuack(); } @Override public void display() { System.out.println("我是玩具鸭..."); } }
Client测试类
public class Client { public static void main(String[] args) { Duck mallardDuck = new MallardDuck(); System.out.println("----绿头鸭----"); mallardDuck.display(); mallardDuck.performQuack(); mallardDuck.performFly(); Duck redHeadDuck = new RedHeadDuck(); System.out.println("----红头鸭----"); redHeadDuck.display(); redHeadDuck.performQuack(); redHeadDuck.performFly(); Duck rubberDuck = new RubberDuck(); System.out.println("----玩具鸭----"); rubberDuck.display(); rubberDuck.performFly(); rubberDuck.performQuack(); System.out.println("玩具鸭添加发声"); redHeadDuck.setQuackBehavior(new Quack()); redHeadDuck.performQuack(); } }
实现结果:
策略模式的注意事项和细节
策略模式的关键是:分析项目中变化部分与不变部分。 策略模式的核心思想是:多用组合/聚合少用继承;用行为类组合,而不是行为的继承。更有弹性体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if.else if.else )。 提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~