Java实现策略模式

server/2025/2/11 9:00:56/

一、简介

1、定义

  策略模式(Strategy Pattern)是一种行为设计模式,它定义一系列算法,将每一个算法封装起来,算法之间可以相互替换。通过定义策略接口和具体策略实现类,将算法封装为对象,并在运行时选择对应的算法。

2、策略模式的结构

策略模式涉及以下几个角色:
策略(Strategy)接口:提供所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)实现:实现策略接口,包装了相关的算法。
环境(Context):维护策略,调用对应的策略。

二、Java实现案例

1、策略模式通用案例

java">/*** @Description: 策略接口* @Date: 2025-02-08 13:16* @Author: gaoyufei**/
public interface Strategy {void execute();
}/*** @Description: 具体策略A* @Date: 2025-02-08 13:17* @Author: gaoyufei**/
public class ConcreteStrategyA implements Strategy{@Overridepublic void execute() {System.out.println("执行具体策略A");}
}/*** @Description: 具体策略B* @Date: 2025-02-08 13:17* @Author: gaoyufei**/
public class ConcreteStrategyB implements Strategy{@Overridepublic void execute() {System.out.println("执行具体策略B");}
}/*** @Description: 上下文类* @Date: 2025-02-08 13:18* @Author: gaoyufei**/
public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy=strategy;}public void setStrategy(Strategy strategy){this.strategy=strategy;}public void executeStrategy(){strategy.execute();}
}/*** @Description: 客户端* @Date: 2025-02-08 13:20* @Author: gaoyufei**/
public class ClientMain {public static void main(String[] args) {Context context=new Context(new ConcreteStrategyA());context.executeStrategy();context.setStrategy(new ConcreteStrategyB());context.executeStrategy();}
}

2、加减乘除运算策略案例

java">/*** @Description: 运算接口* @Date: 2025-02-08 13:32* @Author: gaoyufei**/
public interface Operation {int execute(int a, int b);
}
/*** @Description: 加法运算* @Date: 2025-02-08 13:33* @Author: gaoyufei**/
public class AddOperation implements Operation{@Overridepublic int execute(int a, int b) {return a+b;}
}
/*** @Description: 减法运算* @Date: 2025-02-08 13:33* @Author: gaoyufei**/
public class SubOperation implements Operation{@Overridepublic int execute(int a, int b) {return a-b;}
}
/*** @Description: 乘法运算* @Date: 2025-02-08 13:34* @Author: gaoyufei**/
public class MultiOperation implements Operation{@Overridepublic int execute(int a, int b) {return a*b;}
}
/*** @Description: 除法运算* @Date: 2025-02-08 13:34* @Author: gaoyufei**/
public class DivOperation implements Operation{@Overridepublic int execute(int a, int b) {return a/b;}
}import java.util.HashMap;
import java.util.Map;
import java.util.Optional;/*** @Description: 操作者工厂类* @Date: 2025-02-08 13:35* @Author: gaoyufei**/
public class OperatorFactory {private static Map<String, Operation> map=new HashMap<>();static {map.put("+",new AddOperation());map.put("-",new SubOperation());map.put("*",new MultiOperation());map.put("/",new DivOperation());}public static Optional<Operation> getOperation(String operator){return Optional.ofNullable(map.get(operator));}
}/*** @Description: 测试类* @Date: 2025-02-08 13:39* @Author: gaoyufei**/
public class OperatorTestMain {public static void main(String[] args) {Operation add = OperatorFactory.getOperation("+").orElseThrow(() -> new IllegalArgumentException("无效操作"));int addRes = add.execute(2, 3);System.out.println("2+3="+addRes);Operation sub = OperatorFactory.getOperation("-").orElseThrow(() -> new IllegalArgumentException("无效操作"));int subRes = sub.execute(5, 1);System.out.println("5-1="+subRes);Operation multi = OperatorFactory.getOperation("*").orElseThrow(() -> new IllegalArgumentException("无效操作"));int multiRes = multi.execute(2, 2);System.out.println("2*2="+multiRes);Operation div = OperatorFactory.getOperation("/").orElseThrow(() -> new IllegalArgumentException("无效操作"));int divRes = div.execute(6, 2);System.out.println("6/2="+divRes);}
}

3、springboot项目策略模式实现

java">/*** @Description: Strategy* @Date: 2025-02-08 14:40* @Author: gaoyufei**/
public interface Strategy {void method();
}import org.springframework.stereotype.Service;
/*** @Description: 策略A* @Date: 2025-02-08 14:40* @Author: gaoyufei**/
@Service("strategyA")
public class StrategyA implements Strategy{@Overridepublic void method() {System.out.println("实现策略A方法");}
}import org.springframework.stereotype.Service;
/*** @Description: 策略B* @Date: 2025-02-08 14:40* @Author: gaoyufei**/
@Service("strategyB")
public class StrategyB implements Strategy{@Overridepublic void method() {System.out.println("实现策略B方法");}
}import org.springframework.stereotype.Service;
/*** @Description: 策略C* @Date: 2025-02-08 14:40* @Author: gaoyufei**/
@Service("strategyC")
public class StrategyC implements Strategy{@Overridepublic void method() {System.out.println("实现策略C方法");}
}/*** @Description: 策略枚举* @Date: 2025-02-08 14:43* @Author: gaoyufei**/
public enum StrategyEnum {strategyA(1,"strategyA"),strategyB(2,"strategyB"),strategyC(3,"strategyC");private Integer code;private String name;public Integer getCode() {return code;}public String getName() {return name;}StrategyEnum(Integer code, String name){this.code=code;this.name=name;}public static String getName(Integer code){StrategyEnum[] enums = StrategyEnum.values();for(int i=0;i<enums.length;i++){if(enums[i].getCode().equals(code)){return enums[i].getName();}}return null;}
}import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;/*** @Description: StrategyContext* @Date: 2025-02-08 14:50* @Author: gaoyufei**/
@Component
public class StrategyContext {private static Map<String,Strategy> strategyMap=new HashMap<>();@Autowiredprivate ApplicationContext applicationContext;@PostConstructpublic void init(){strategyMap.putAll(applicationContext.getBeansOfType(Strategy.class));}public Strategy getStrategy(Integer code){return strategyMap.get(StrategyEnum.getName(code));}
}import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;/*** @Description: StrategyController* @Date: 2025-02-08 14:57* @Author: gaoyufei**/
@RestController
public class StrategyController {@Autowiredprivate StrategyContext strategyContext;@RequestMapping("/method")public void testMethod(@RequestParam("code") Integer code){Strategy strategy = strategyContext.getStrategy(code);if(strategy!=null) {strategy.method();}}
}

http://www.ppmy.cn/server/166424.html

相关文章

来自国外的实用软件 ,已接触所有限制!

今天我给大家带来了一款超棒的全自动抠图软件&#xff0c;真的是一个来自国外的宝藏工具&#xff01;而且好消息是&#xff0c;它现在完全解除了限制&#xff0c;可以无限畅快地使用了。 Teorex PhotoScissors 抠图软件 这款软件特别贴心&#xff0c;根本不需要安装&#xff0…

DeepSeek模型构建与训练

在完成数据预处理之后,下一步就是构建和训练深度学习模型。DeepSeek提供了简洁而强大的API,使得模型构建和训练变得非常直观。无论是简单的全连接网络,还是复杂的卷积神经网络(CNN)或循环神经网络(RNN),DeepSeek都能轻松应对。本文将带你一步步构建一个深度学习模型,并…

YOLOV8 OpenCV + usb 相机 实时识别

0、STM32 上位机通信 STM32 上位机通信 1、OpenCV 读相机 import cv2cap cv2.VideoCapture(0) while (1):# get a frameret, frame cap.read()# show a framecv2.imshow("capture", frame)if cv2.waitKey(1) & 0xFF ord(q):# cv2.imwrite("/opt/code/…

为什么mysql默认RR(repeat read可重复读)隔离级别

为什么默认设置rr?: 隔离级别\解决问题脏读不可重复读幻读读未提交OOO读提交❌OO重复读❌❌序列化❌❌❌ 脏读&#xff1a; 某个事务已更新一份数据&#xff0c;另一个事务在此时读取了 同一份数据&#xff0c;由于某些原因&#xff0c;前一个RollBack操作了操作&#xff0c;…

秒杀系统设计总结

文章目录 系统架构访问层优化中间转发层与限流服务端利用Redis数据库优化并发控制与数据一致性安全防护监控与报警 系统架构 微服务架构&#xff1a;将复杂的秒杀系统拆分为多个独立的微服务&#xff0c;如用户服务、商品服务、订单服务、秒杀服务等。每个微服务专注于特定业务…

程序猿成长之路之数据挖掘篇——决策树分类算法(2)——构建决策树

上次讲到信息熵和信息增益&#xff0c;讲了理论知识现在让我们构建决策树 1. 树的基本知识 二叉树&#xff1a;一棵树由根节点和子节点组成&#xff0c;子节点又分为叶子节点和非叶子节点&#xff0c;每个非叶子节点都由两个分支组成&#xff0c;分别为该节点的左、右子树。其二…

【含文档+PPT+源码】基于微信小程序的校园志愿者管理系统的设计与实现

项目介绍 本课程演示的是一款 基于微信小程序的校园志愿者管理系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本…

Node.js 实现简单爬虫

介绍 爬虫是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。 本文将使用 Nodejs 编写一个简单的爬虫脚本&#xff0c;爬取一个美食网站&#xff0c;获取菜品的标题和图片链接&#xff0c;并以表格的形式输出。 准备工作 1、初始化项目 首先&#xff0…