Java设计模式---策略模式

ops/2025/2/7 16:23:28/

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法(或策略),并将每个算法封装起来,使得它们可以互相替换。策略模式允许算法的变化独立于使用算法的客户(即客户端代码)。简而言之,它让我们可以在运行时选择具体的算法,避免了大量的 if-elseswitch 语句。

策略模式的组成部分

策略模式主要有以下几个组成部分:

  1. Context(上下文):持有一个策略的引用,可以更换不同的策略来执行某个操作。
  2. Strategy(策略接口):定义一个策略接口,通常这个接口包含一个方法,这个方法是被策略实现类所共享的。
  3. ConcreteStrategy(具体策略):具体的策略类,实现策略接口,定义具体的算法或行为。
  4. Client(客户端):通过设置策略(ConcreteStrategy)来决定使用哪种具体策略。

策略模式的结构图

        +---------------------+
        |      Context        |
        +---------------------+
        | - strategy: Strategy |
        +---------------------+
        | + setStrategy()      |
        | + execute()          |
        +---------------------+
                  ^
                  |
      +-----------+-----------+
      |                       |
+--------------+        +--------------+
| Strategy     |        | ConcreteStrategyA |
+--------------+        +---------------------+
| + algorithm()|        | + algorithm()       |
+--------------+        +---------------------+
                        +---------------------+
                        | ConcreteStrategyB   |
                        +---------------------+
                        | + algorithm()       |
                        +---------------------+
 

1.方法入口

java">@Component
public class AppContext {@Autowiredprivate List<AppStrategy> userAppStrategyList;private final Map<String, AppStrategy> STRATEGYMAP = new HashMap<>();@PostConstructpublic void init() {userAppStrategyInterfaceList.forEach(strategy -> {STRATEGYMAP.put(strategy.type(), strategy);});}public void add(UserDto userDto) {STRATEGYMAP.entrySet().stream().filter(entry -> entry.getKey().contains(userDto.getType().toString())).findFirst().ifPresent(entry -> entry.getValue().add(userDto));}}

2.接口

java">public interface AppStrategy {String type();void add(UserDto dto);}

3.实现类

实现类1

java">@Service
@Slf4j
public class AppCompanyService implements AppStrategy {@Overridepublic String type() {return "1,2";}@Overridepublic void add(UserDto dto) {log.info("调用了实现类1");}
}

 实现类2

java">@Service
@Slf4j
public class AppPersonService implements AppStrategy {@Overridepublic String type() {return "3,4";}@Overridepublic void add(UserDto dto) {log.info("调用了实现类2");}
}

4.调用

java">@Service
@Slf4j
public class AppUserService {@Resourceprivate AppContext appContext;@GlobalTransactionalpublic void add(UserDto userDto) throws Exception {userDto.setType(1);appIdentityContext.add(userIdentityDto);}
}

这样就完成了一个策略模式的小demo。


http://www.ppmy.cn/ops/156477.html

相关文章

【ThreeJS 01】了解 WebGL 以及 ThreeJS

文章目录 01 介绍02 什么是 WebGL&#xff0c;为什么用 ThreeJS什么是 WebGL&#xff1f;Three.js 来帮忙 01 介绍 这个课程的主讲人是 Bruno Simon&#xff0c; 这是他的作品集 他还做了一些有趣的项目&#xff1a; https://my-room-in-3d.vercel.app https://organic-sphe…

npm 和 pip 安装中常见问题总结

安装路径的疑惑&#xff1a;NPM 和 PIP 的安装机制 NPM 安装路径规则&#xff1a; 依赖安装在项目目录下&#xff1a; 当你运行 npm install --save-dev jest&#xff0c;它会在当前目录&#xff08;例如 F:\&#xff09;下创建一个 node_modules 文件夹&#xff0c;把 jest 安…

frida 通过 loadLibrary0 跟踪 System.loadLibrary

static {System.loadLibrary("libxxx.so"); }在 ndk 开发中&#xff0c;常见的实践是在 static 代码块里调用 loadLibrary 加载动态库。由于 apk 从 java 层开始启动&#xff0c;过早地 hook 原生代码会找不到函数。所以一种常见做法是在 loadLibrary 的 hook 回调里…

如何使用sqlalchemy的orm模式构建表结构1对1,1对多,多对多的关系

在 SQLAlchemy 的 ORM 模式中&#xff0c;可以通过定义类和关系来构建表结构&#xff0c;实现一对一、一对多和多对多的关系。以下是具体的实现方式&#xff1a; 1. 一对一关系&#xff08;One-to-One&#xff09; 一对一关系是指一个记录与另一个记录之间存在唯一对应关系。…

I.MX6ULL 中断介绍下

GIC重点寄存器 1.中断分发器寄存器&#xff08;Distributor register &#xff09; a.Distributor Control Register(中断分发控制寄存器), GICD_CTLR Purpose Enables the forwarding of pending interrupts from the Distributor to the CPU interfaces 使能将挂起的中断从…

C++Primer 赋值运算符

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

Leetcode—340. 至多包含 K 个不同字符的最长子串【中等】Plus(力扣159变体罢了改个参数而已)

2025每日刷题&#xff08;209&#xff09; Leetcode—340. 至多包含 K 个不同字符的最长子串 实现代码 class Solution { public:int lengthOfLongestSubstringKDistinct(string s, int k) {// 字符串 s 和整数 k// 至多包含 k 个不同vector<int> cnt(128);int len s.…

WebRTC 客户端与ZLMediaKit通讯

1 web浏览器js方式 要使用 WebRTC 客户端与 ZLMediaKit 通讯&#xff0c;您需要设置一个 WebRTC 客户端并与 ZLMediaKit 进行连接。以下是一个基本的步骤和示例代码&#xff0c;帮助您实现这一目标。 ### 步骤 1. **安装 ZLMediaKit**&#xff1a;确保您已经在服务器上安装并…