当前位置 : 主页 > 编程语言 > java >

设计模式——策略模式

来源:互联网 收集:自由互联 发布时间:2022-07-04
模式介绍 策略模式(Strategy Patterm)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 这算法体现了几个设计原则, 把变

模式介绍

  • 策略模式(Strategy Patterm)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
  • 这算法体现了几个设计原则,
    • 把变化的代码从不变的代码中分离出来;
    • 针对接口编程而不是具体类(定义了策略接口);
    • 多用组合/聚合,少用继承(客户通过组合方式使用策略)。

UML类图

image.png

策略模式案例

背景介绍:定义一个鸭子类鸭子原本有游泳、飞翔、发声等方法,但并不是所有鸭子都会有飞翔、发声方法(如玩具鸭、诱饵鸭等)所以将飞翔和发声抽离出来做成一个抽象类,并聚合到鸭子类中使需要实现得类调用具体方法

image.png

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(); } }

实现结果:

image.png

策略模式的注意事项和细节

  • 策略模式的关键是:分析项目中变化部分与不变部分。
  • 策略模式的核心思想是:多用组合/聚合少用继承;用行为类组合,而不是行为的继承。更有弹性体现了“对修改关闭,对扩展开放”原则,客户端增加行为不用修改原有代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if.else if.else )。
  • 提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展。
  • 需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数目庞。
上一篇:【java】编写程序
下一篇:没有了
网友评论