初探设计模式——策略模式

157 阅读3分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战」。

1.模式动机

  • 一件事情有多种解决方案,根据不同的条件可以选择合适的方案就是一种策略;
  • 软件开发中一个功能有多种实现方式,根据不同的条件选择具体的实现方式就是一种策略;

2.模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换。

3.模式结构

策略模式有三个角色:

  • Context: 环境类
  • Strategy: 抽象策略类
  • ConcreteStrategy: 具体策略类

4.时序图

5.代码分析

代码案例:要去某个地方,有三种交通工具前往,公交车、地铁、自驾,根据自己的喜好选择前往

  • 环境类:Target
  • 抽象策略类:Tool
  • 具体策略类:BusTool、SubwayTool、CarTool
/**
 * 抽象策略类:前往目的地的方式
 */
public interface Tool {
    void go();
}

/**
 * 具体策略类:公交车
 */
public static class BusTool implements Tool {

    @Override
    public void go() {
        System.out.println("公交车前往");
    }
}

/**
 * 具体策略类:地铁
 */
public static class SubwayTool implements Tool {

    @Override
    public void go() {
        System.out.println("地铁前往");
    }
}

/**
 * 具体策略类:自驾
 */
public static class CarTool implements Tool {

    @Override
    public void go() {
        System.out.println("自驾前往");
    }
}

/**
 * 环境:目标
 */
public static class Target {

    public void setTool(Tool tool) {
        tool.go();
    }
}

//具体使用,跟住距自身条件选择合适的(实例化)交通工具
public static void main(String[] args) {
    Target target = new Target();

    Tool busTool = new BusTool();
    target.setTool(busTool);

    Tool subwayTool = new SubwayTool();
    target.setTool(subwayTool);

    Tool carTool = new CarTool();
    target.setTool(carTool);
}

//运行结果
公交车前往
------------------
地铁前往
------------------
自驾前往

6.模式分析

  • 策略模式是对算法的封装,它把算法的责任和算法本身进行了分割,将系统中的算法封装到策略类中,作为抽象策略类的子类。
  • 具体使用时是由客户端决定要用哪一种策略,因此客户端就要知道所有策略类以及他们之间的区别,这样就拥有了较高的灵活性。

7.优点

  • 策略模式完美支持了【开闭原则】,增加新的算法或者替换其他时都无需修改原有系统。
  • 策略模式提供了管理相关算法组族办法。
  • 可以避免使用多重条件转移语句。

8.缺点

  • 客户端需要知道所有具体的策略类以及他们之间的区别,在一定程度上增加了使用难度。
  • 策略模式中会存在很多个具体策略类。

9.适用环境

  • 如果一个系统中有多个算法并且他们之间的区别只是行为不同,那就可以采用策略模式,动态的让一个对象中从众多算法中选择其中一个。
  • 系统中包含了许多算法且要从中选择一个。
  • 不想让对象知道算法的具体逻辑与数据结构,这些逻辑都要封装子啊具体的策略类中。

10.模式扩展

策略模式与状态模式

  • 可以通过环境类状态的个数来决定是使用策略模式还是状态模式。
  • 策略模式的环境类自己选择一个具体策略类,具体策略类无须关心环境类;而状态模式的环境类由于外在因素需要放进一个具体状态中,以便通过其方法实现状态的切换,因此环境类和状态类之间存在一种双向的关联关系。
  • 使用策略模式时,客户端需要知道所选的具体策略是哪一个,而使用状态模式时,客户端无须关心具体状态,环境类的状态会根据用户的操作自动转换。
  • 如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些状态之间可以发生转换时使用状态模式;如果系统中某个类的某一行为存在多种实现方式,而且这些实现方式可以互换时使用策略模式。



参考链接:策略模式