策略模式

简介: 策略模式

只有永远躺在泥坑里的人,才不会再掉进坑里。——黑格尔

今天聊聊策略模式

一个导航程序,提供多种出行方式的导航策略

例如最开始就两种策略如步行和公路出行,我们将它写到一个类中

慢慢的,新增了公共交通,步行和公路出行中的逻辑越来越多,越来越复杂

如果此时不进行抽取,则会导致一个类中的代码行数过多,维护起来困难,如果是团队开发,代码冲突不断

抽取后能解决此问题,并且一些公共逻辑抽取出来能减少重复代码

因此我们将所有策略抽取出一个公共接口:

package com.ruben.strategies.exapmle;
import java.util.List;
/**
 * 路线规划策略接口
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/16 19:10
 */
public interface RouteStrategy {
    /**
     * 路线规划
     *
     * @param start 起点
     * @param end   终点
     * @return 路线
     */
    List<String> buildRoute(String start, String end);
}

这里定义的是传入起点和终点,返回途中经过的路线集合

接下来,我们实现具体策略逻辑

package com.ruben.strategies.exapmle;
import java.util.Arrays;
import java.util.List;
/**
 * 公路路线规划,如开车、出租等
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/16 19:13
 */
public class RoadStrategy implements RouteStrategy {
    /**
     * 路线规划
     *
     * @param start 起点
     * @param end   终点
     * @return 路线
     */
    @Override
    public List<String> buildRoute(String start, String end) {
        // 具体逻辑,实际开发中可能超长一串,这里返回通过起点和终点规划出来的公路路线
        return Arrays.asList("先到达成华大道", "途径二仙桥", "路过加油站");
    }
}
package com.ruben.strategies.exapmle;
import java.util.Arrays;
import java.util.List;
/**
 * 公共交通出行路线规划
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/16 19:20
 */
public class PublicTransportStrategy implements RouteStrategy {
    /**
     * 路线规划
     *
     * @param start 起点
     * @param end   终点
     * @return 路线
     */
    @Override
    public List<String> buildRoute(String start, String end) {
        // 具体逻辑,实际开发中可能超长一串,这里返回通过起点和终点规划出来的公共交通出行路线
        return Arrays.asList("杉板桥站乘坐地铁8号线", "到达理工大学换成地铁7号线", "二仙桥站下地铁");
    }
}



然后是核心

package com.ruben.strategies.exapmle;
import java.util.List;
/**
 * 导航
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/16 19:31
 */
public class Navigator {
    private RouteStrategy routeStrategy;
    /**
     * 构造函数
     *
     * @param routeStrategy 策略
     */
    public Navigator(RouteStrategy routeStrategy) {
        this.routeStrategy = routeStrategy;
    }
    /**
     * 设置路线规划策略,应变策略变更的情况
     *
     * @param routeStrategy 策略
     */
    public void setRouteStrategy(RouteStrategy routeStrategy) {
        this.routeStrategy = routeStrategy;
    }
    /**
     * 路线规划
     *
     * @param start 起点
     * @param end   终点
     * @return 路线
     */
    public List<String> buildRoute(String start, String end) {
        System.out.println("用户选择了:" + routeStrategy.getClass().getSimpleName());
        System.out.println("起点为:" + start);
        System.out.println("终点为:" + end);
        return this.routeStrategy.buildRoute(start, end);
    }
}

这里路线规划的方法,抽取出了公共部分,打印出用户的选择,以及起点和终点

最后是实际调用,这里只是简单进行一个模拟

package com.ruben.strategies.exapmle;
import java.util.List;
/**
 * 路线规划应用
 *
 * @author <achao1441470436@gmail.com>
 * @since 2021/10/16 19:36
 */
public class NavigatorApplication {
    public static void main(String[] args) {
        String start = "成华大道";
        String end = "二仙桥";
        System.out.println("用户选择了查看步路线");
        Navigator navigator = new Navigator(new WalkingStrategy());
        List<String> route = navigator.buildRoute(start, end);
        System.out.println(route);
        System.out.println("用户变更了策略,选择查看公路路线规划");
        navigator.setRouteStrategy(new RoadStrategy());
        route = navigator.buildRoute(start, end);
        System.out.println(route);
        System.out.println("用户变更了策略,选择查看公共交通路线规划");
        navigator.setRouteStrategy(new PublicTransportStrategy());
        route = navigator.buildRoute(start, end);
        System.out.println(route);
    }
}

运行结果:

策略模式优点

  • 你可以在运行时切换对象内的算法。
  • 你可以将算法的实现和使用算法的代码隔离开来。
  • 你可以使用组合来代替继承。
  • 开闭原则。 你无需对上下文进行修改就能够引入新的策略。

策略模式缺点

  • 如果你的算法极少发生改变, 那么没有任何理由引入新的类和接口。 使用该模式只会让程序过于复杂。
  • 客户端必须知晓策略间的不同——它需要选择合适的策略。
  • 许多现代编程语言支持函数类型功能, 允许你在一组匿名函数中实现不同版本的算法。 这样, 你使用这些函数的方式就和使用策略对象时完全相同, 无需借助额外的类和接口来保持代码简洁。
相关文章
|
2天前
|
设计模式 算法 C#
C# 一分钟浅谈:策略模式与状态模式
【10月更文挑战第13天】本文介绍了两种常见的行为型设计模式:策略模式和状态模式。策略模式通过封装一系列算法并使其可互换,实现算法的灵活变化;状态模式则通过改变对象的内部状态来改变其行为。文章通过C#代码示例详细说明了这两种模式的应用场景、常见问题及解决方法。
28 19
|
29天前
|
设计模式 算法 搜索推荐
策略模式的小记
本文介绍了策略模式的概念、结构和使用场景,并通过支付系统的例子展示了如何使用策略模式来动态选择不同的支付策略,包括定义支付策略接口、实现具体的支付策略类、创建上下文类以及在客户端动态选择支付策略。
策略模式的小记
|
5月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
31 1
|
设计模式 算法 Java
什么场景要使用策略模式,什么场景不能使用?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
159 0
|
前端开发
策略模式
策略模式
76 0
|
设计模式 算法
策略模式详细介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。
113 0
|
算法 测试技术 C#
C#策略模式
C#策略模式
68 0
|
设计模式 前端开发
关于策略模式我所知道的
关于策略模式我所知道的
85 0
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
84 0