JAVA笔记 | 实际上用到的策略模式(可直接套用)

自己开发中用到了策略模式,这样写不一定是最好的,但是满足了业务场景跟使用要求,做个笔记,下次有用到可以快速复习跟套用

假设使用场景:有几只宠物,猫跟狗等,要求他们做各种动作,比如叫,跑等,但是作为宠物这些都是相同的动作,只是猫,狗具体的表现不同,比如猫叫是喵,狗叫是汪

1.创建基础策略接口PetStrategy

java 复制代码
public interface PetStrategy {
    //类型 cat-猫,dog-狗
    String getType();

    //执行动作 1 - 叫bark
    String bark();

    //执行动作 2 - 跑RUN 带参数例子
    String run(String name);
}

2.创建实现PetStrategy接口的猫CatStrategy跟狗DogStrategy用于实现具体的表现

注意加上@Service

java 复制代码
//猫实现类
@Service
public class CatStrategy implements PetStrategy{
    @Override
    public String getType() {
        return "cat";
    }

    @Override
    public String bark() {
        return "猫叫喵喵喵";
    }
    
    @Override
    public String run(String name) {
        return name + "猫跑了";
    }
}

//狗实现类
@Service
public class DogStrategy implements PetStrategy{
    @Override
    public String getType() {
        return "dog";
    }

    @Override
    public String bark() {
        return "狗叫汪汪汪";
    }

    @Override
    public String run(String name) {
        return name + "狗跑了";
    }
}

3.创建统一策略入口,即不同宠物类型type进来进行分配对应的策略

java 复制代码
public interface PetStrategyHandler {
    //宠物叫行为
    String bark(String type);
    //宠物跑行为-带入参
    String run(String type,String name);
}

4.创建入口配置类,接收入口传来的type,用于实际分配不同的策略,类似工厂

java 复制代码
@Configuration
public class PetStrategyConfig {
    @Bean
    public PetStrategyHandler petHandler(List<PetStrategy> strategies) {
        Map<String, PetStrategy> strategyMap = strategies.stream().collect(Collectors.toMap(PetStrategy::getType, item -> item));
        PetStrategyHandler handler = new PetStrategyHandler() {
            @Override
            public String bark(String type) {
                return strategyMap.get(type).bark();
            }
            @Override
            public String run(String type,String name) {
                return strategyMap.get(type).run(name);
            }
        };
        return handler;
    }
}

5.创建controller测试

java 复制代码
@RestController
@RequestMapping("/pet")
public class PetController {
    @Resource
    private PetStrategyHandler handler;
    @GetMapping("/bark/{type}")
    public String bark(@PathVariable String type){
        return this.handler.bark(type);
    }

    @GetMapping("/run/{type}")
    public String run(@PathVariable String type,
                      @RequestParam String name){
        return this.handler.run(type,name);
    }
}

这样后续如果有新的动物,只需增加新的xxStrategy跟传对应type就好,策略模式替换if的好处不是百分百的,具体看实现要求吧,各有优缺点

相关推荐
yxlalm1 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风2 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
-SOLO-2 小时前
开发笔记-摸鱼输入法
笔记
Seoyoneh2 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人2 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr2 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei3 小时前
Java 写 Agent:模型只是组件
java·开发语言
彧azz3 小时前
Java学习语法篇:变量
java·学习
信誓旦旦的程序猿5 小时前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)5 小时前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18