教你一篇使用java策略模式实战干起来

2024-01-07 21:35:04

教你一篇使用java策略模式实战

设计模式:策略模式



前言

当谈到设计模式时,策略模式无疑是一个强大而灵活的工具。它属于行为设计模式的一种,主要用于定义一系列算法,将每个算法封装起来,并且使它们可以相互替换,让客户端代码独立于算法的变化。

策略模式的核心思想是将算法的定义与使用分离,使得算法的变化不会影响到使用算法的客户端代码。这种模式在许多情况下都能够提高代码的可维护性和扩展性,同时降低了耦合度。

在Java中,策略模式通常涉及到定义一组算法接口,然后分别实现这些接口以提供具体的算法实现。客户端代码可以动态地选择使用哪种算法,而不需要修改自身的代码。这种灵活性使得策略模式成为处理算法族、复杂条件语句以及提高代码复用性的理想选择。

在接下来的实现中,我们将深入探讨策略模式的实现细节,并演示如何在Java中应用这一设计模式,以实现可维护、可扩展的代码结构。通过策略模式,我们可以更加灵活地应对业务需求的变化,使得系统更加健壮而可靠。


一、使用步骤

新建一个枚举类

package com.cn.blogboot.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
//行为枚举
@AllArgsConstructor
@Getter
public enum OperationEnum {

    /** 新增 */
    NEWLY("NEWLY"),

    /** 删除 */
    DELETE("DELETE"),

    /** 编辑 */
    EDIT("EDIT"),
    /** 查询 */
    QUERY("QUERY");

    /** 行为 */
    private final String dec;
}

新建约束接口

package com.cn.blogboot.service;

import com.cn.blogboot.dto.SysConfigDot;

public interface SysConfigStrategy {

    String type(); // 类型


    boolean isTypeMatch(String type); //判断类型


    void execution(SysConfigDot dot); // 具体执行 这个里面的dto 自己业务定义
}

在新建一个 SysConfigStrategyFactory

package com.cn.blogboot.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
@RequiredArgsConstructor
public class SysConfigStrategyFactory {
     private final List<SysConfigStrategy> sysConfigStrategies;

     public SysConfigStrategy getImpl(String type){
         return sysConfigStrategies.stream()
                 .filter(strategy -> strategy.isTypeMatch(type))
                 .findAny()
                 .orElseThrow(() -> new RuntimeException("未找到该类型的执行操作"));
     }

}

private final List sysConfigStrategies; 就是上面之前那个接口

怎么使用呢?

这个就很简单了
新建三个行为类型 分别是 删除 修改 新增

删除
并且去实现之前那个约束接口

package com.cn.blogboot.service.sysconfigstrategy;

import com.cn.blogboot.dto.SysConfigDot;
import com.cn.blogboot.enums.OperationEnum;
import com.cn.blogboot.exception.CustomException;
import com.cn.blogboot.mapper.SysConfigMapper;
import com.cn.blogboot.service.SysConfigStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Optional;

@Service
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor
@Slf4j
public class DeleteSysConfigServiceImpl  implements SysConfigStrategy {

    private final SysConfigMapper sysConfigMapper;
    @Override
    public String type() {
        return OperationEnum.DELETE.getDec();
    }

    @Override
    public boolean isTypeMatch(String type) {
        return  type.equals(type());
    }
  // 这个是具体的执行 我这里是删除
    @Override
    public void execution(SysConfigDot dot) {
        final int deleteById = sysConfigMapper.deleteById(dot.getId());
        Optional.of(deleteById)
                .filter(result -> result > 0)
                .orElseThrow(() ->  new CustomException("删除配置失败", 500));
    }
}

修改

package com.cn.blogboot.service.sysconfigstrategy;

import com.cn.blogboot.dto.SysConfigDot;
import com.cn.blogboot.enums.OperationEnum;
import com.cn.blogboot.service.SysConfigStrategy;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(rollbackFor = Exception.class)
@RequiredArgsConstructor
@Slf4j
public class EditSystConfigServiceImpl  implements SysConfigStrategy {
    @Override
    public String type() {
        return OperationEnum.DELETE.getDec();
    }

    @Override
    public boolean isTypeMatch(String type) {
        return  type.equals(type());
    }

    @Override
    public void execution(SysConfigDot dot) {
       // 具体执行的 你的修改
    }
}

新增也是一样的哦,我这里偷懒偷懒

二、接口调用

 /**
     * 策略工厂 :: 添加配置-删除配置-修改配置
     * @return Result
     * @throws ParseException
     */
    @PostMapping(value = "/currency/setsysconfig", name = "添加配置-删除配置-修改配置", produces = MediaType.APPLICATION_JSON_VALUE)
    @HandleCurrencyRoleException
    public Result currencyRole(@RequestBody SysConfigDot dto) throws ParseException {
        SysConfigStrategy impl = sysConfigStrategy.getImpl(dto.getBehavior());
        impl.execution(dto);
        return Result.ok();
    }

总结

这有些业务使用起来还是很方便的
不管多少个选择,最后都是二选一!~~~

文章来源:https://blog.csdn.net/weixin_45870300/article/details/135444370
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。