当前位置: 首页 > article >正文

行为设计模式 -策略设计模式- JAVA

策略设计模式

    • 一 .简介
    • 二. 案例
      • 2.1 抽象策略(Strategy)类
      • 2.2 具体策略(Concrete Strategy)类
      • 2.3 环境(Context)类
      • 2.4 测试
    • 三. 结论
      • 3.1 优缺点
      • 3.2 使用场景

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一 .简介

**百度百科:**策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。

个人理解: 要完成一件事情,你可以选择多种方式的时候。

定义策略设计模式是行为设计模式的一种。当我们对特定任务有多种算法并且客户端决定在运行时使用的实际实现时,使用策略模式。

策略模式的主要角色如下:

  • 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
  • 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
  • 环境(Context)类:持有一个策略类的引用,最终给客户端调用。

二. 案例

假设我们要去旅行(travel mode),出行的方式有很多种,可以坐高铁(railway),可以坐飞机(plane),那么我们就可以通过策略模式去实现出行的方式,让客户端去选择

image-20240605135228083

2.1 抽象策略(Strategy)类

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:26
 * @Description 出行方式
 */
public interface Strategy {
    /**
     * 出行的方式
     */
    void way();
}

2.2 具体策略(Concrete Strategy)类

飞机

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:28
 * @Description 飞机
 */
public class Plane implements Strategy {
    @Override
    public void way() {
        System.out.println("飞机出行");
    }
}

铁路

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:27
 * @Description 铁路
 */
public class RailWay implements Strategy {

    @Override
    public void way() {
        System.out.println("高铁出行");
    }
}

2.3 环境(Context)类

用户连接上下文,给客户端调用的类

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:30
 * @Description 出行方式
 */
public class TravelMode {

    // 抽象策略角色的引用
    private final Strategy strategy;

    public TravelMode(Strategy strategy) {
        this.strategy = strategy;
    }

    // 客户使用的出行方式
    public void way() {
        strategy.way();
    }
}

2.4 测试

/**
 * @author chenyunzhi
 * @date 2024/6/5 11:29
 * @Description
 */
public class StrategyPatternTest {
    public static void main(String[] args) {
        // 飞机出行
        TravelMode travelMode = new TravelMode(new Plane());
        travelMode.way();
        // 高铁出行
        TravelMode travelMode1 = new TravelMode(new RailWay());
        travelMode1.way();
    }
}

image-20240605134710520

三. 结论

3.1 优缺点

1. 优点:

  • 策略类之间可以自由切换

    由于策略类都实现同一个接口,所以使它们之间可以自由切换。

  • 易于扩展

    增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“

  • 避免使用多重条件选择语句(if else),充分体现面向对象设计思想。

2.缺点:

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
  • 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。

3.2 使用场景

  • 一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
  • 一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
  • 系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
  • 系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
  • 多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
  • 我们可以使用组合来为策略创建实例变量,但我们应该避免这种情况,因为我们希望将特定策略应用于特定任务。以比较器作为参数的 Collections.sort() 和 Arrays.sort() 方法也遵循相同的方法。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。


http://www.kler.cn/news/330635.html

相关文章:

  • sentinel原理源码分析系列(三)-启动和初始化
  • 人生四大“钱关”过不去,我推荐你读这4本书
  • Redis接口访问优化
  • 六.应用层
  • python 实现power iteration幂迭代算法
  • 【C语言指南】数据类型详解(下)——自定义类型
  • 【Android 14源码分析】Activity启动流程-3
  • 全栈杂谈第四期 什么是雪花算法
  • 打造智慧金融:引领未来的投资之路
  • 基于RBAC的通用权限管理系统的详细分析与实现(实现篇-Spring Security安全管理框架)
  • 如何避免我的住宅ip被污染
  • 解决方案:梯度提升树(Gradient Boosting Trees)跟GBDT(Gradient Boosting Decision Trees)有什么区别
  • 已经部署了ssl证书,网站仍被Chrome标记为不安全怎么办?
  • golang grpc初体验
  • OpenEuler配置本地yum源
  • 排序算法之快速排序
  • 【Qt】控件概述 (1)
  • MySQL 分组
  • 完美解决Idea中如何对Java Agent进行断点调试的方式
  • 动态规划