一、简介

我们知道Java中有许多的设计模式,总共32个左右。常见比如简单工厂建造者、原型代理桥接等,这些设计模式相当于是一个规范,主要是总结出来便于大家理解开发的一种算法思路

今天主要是给大家介绍一下我们常见策略模式这个模式主要是一种行为设计模式,它能让你在运行动态地改变对象行为。在Java中,我们可以通过接口实现类来实现动态替换策略行为

二、基础架构

策略模式有三个重要的部分环境类、策略接口和具体策略环境接收一个策略对象,并将执行流程委托这个策略对象。策略接口定义一个公共操作,具体策略是对策略接口的实现。

策略模式的主要优点在于它可以让你在运行时改变对象行为。而且你可以独立于其他代码定义新的策略。

public interface Strategy {
    void strategyMethod(); 
}

public class ConcreteStrategyA implements Strategy {
    public void strategyMethod() {
        System.out.println("执行策略A");
    }
}

public class ConcreteStrategyB implements Strategy {
    public void strategyMethod() {
        System.out.println("执行策略B");
    }
}

public class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void contextMethod() {
        strategy.strategyMethod();
    }
}   

三、策略模式应用实例

现在我有一个简单需求demo,主要是通过同学code计算对应code同学得分
代码如下所示

1、接口(包含了对用的code,和得分的计算逻辑,其他实现接口的可以直接使用调用加分、减分)

public interface StudentScoreHandler {

    /**
     * 获取学生分数
     */
    BigDecimal score();

    /**
     * 学生code
     */
    String code();

    /**
     * 加分 通用处理
     */
    default BigDecimal extraPoints(BigDecimal original, BigDecimal addend) {
        return original.add(addend);
    }

    /**
     * 减分 通用处理
     */
    default BigDecimal minusPoints(BigDecimal original, BigDecimal subtrahend) {
        return original.subtract(subtrahend);
    }
}

2、具体策略(001编号学生得分+10,002的学生得分-10)
001学生实现:

@Component
public class KkStudentHandler implements StudentScoreHandler {

    @Override
    public BigDecimal score() {
        return minusPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));
    }

    @Override
    public String code() {
        return "001";
    }
}

002学生实现:

@Component
public class XmStudentHandler implements StudentScoreHandler {

    @Override
    public BigDecimal score() {
        return extraPoints(new BigDecimal(String.valueOf(90.00)), BigDecimal.valueOf(10.00));
    }

    @Override
    public String code() {
        return "002";
    }
}

3、Service
这里有多钟做法,我这里采用的是将所有的策略实现在初始化时候放入map里面,后续来了直接可以取。

@Service
public class StudentScoreService {

    @Resource
    private List<StudentScoreHandler> studentScoreHandlerList;

    private Map<String, StudentScoreHandler> stringStudentScoreHandlerMap;

    @PostConstruct
    private void init() {
        stringStudentScoreHandlerMap = studentScoreHandlerList.stream()
                .collect(Collectors.toMap(StudentScoreHandler::code, it -> it));
    }

    public BigDecimal score(String code) {
        StudentScoreHandler studentScoreHandler = stringStudentScoreHandlerMap.get(code);
        if (ObjectUtil.isEmpty(studentScoreHandler)) {
            return null;
        }
        return studentScoreHandler.score();
    }
}

4、控制器

@RequestMapping("/student")
@RestController
@Slf4j
public class StudentScoreController {
    @Resource
    private StudentScoreService studentScoreService;

    @GetMapping("/score")
    public ResultBean<BigDecimal> score(@RequestParam("code") String code) {
        return ResultBean.create(studentScoreService.score(code));
    }
}

5、Postman测试
需要对应学生code传入即可 获取对应学生分数
001
在这里插入图片描述
002
在这里插入图片描述

原文地址:https://blog.csdn.net/weixin_42039228/article/details/134778499

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_41566.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注