教你一篇使用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();
}
总结
这有些业务使用起来还是很方便的
不管多少个选择,最后都是二选一!~~~