springboot 实现一种通用策略模式框架

文章介绍了策略模式的基本概念,通过创建可选性接口和选择器接口,实现了策略的动态选择。在SpringBoot环境下,使用抽象选择器自动注册策略接口的实现类,简化了代码中的条件判断,提高了代码的可读性和可维护性。文章给出了具体策略接口的定义和实现示例,以及如何在服务中使用选择器来获取并执行相应的策略。
摘要由CSDN通过智能技术生成

一、策略模式简介

  1. 说白了就是用一个接口统一管理一系列类似算法,把算法变成实现独立到一个个实现该接口的类中,然后就可以通过多态,来实现对不同算法的调用。
  2. 策略模式可以避免使用大量的 if-else 或 switch-case 语句,使代码更加清晰、简洁。
  3. 策略模式的缺点是,由于每个算法都是一个独立的类,因此可能会导致类的数量增多。

二、框架定义

  1. 首选需要定义两个接口,一个抽象类:分别是“可选性接口”,“选择器接口”,“抽象选择器”
  2. 可选性接口:Selectable
    该接口用于标记一个策略类表示该策略类可以注册到选择器,返回策略的标识
public interface Selectable {
    /**
     * 服务名称
     * @return
     */
    String getServiceName();
}
  1. 选择器接口:Selector
    可以通过策略标识获取到对应的策略类
public interface Selector < T extends Selectable> {
    /**
     * 根据服务名称获取服务
     * @param serviceName
     * @return
     */
    T getService(String serviceName);
}
  1. 抽象选择器:ServiceSelector
    利用springboot IOC 自动注册指定策略接口的实现类,并可以根据策略标识获取到对应的策略类
public abstract  class ServiceSelector<T extends Selectable> implements Selector<T> {
    private Map<String, T> servicesMap;

    @Autowired(required = false)
     private void setServices(List<T> services) {
        servicesMap = services.stream().collect(Collectors.toMap(T::getServiceName, Function.identity(), (k1, k2) -> k2));
    }

    public T getService(String name) {
        return servicesMap.get(name);
    }

三、使用框架

  1. 首先定义一个策略接口,继承或实现Selectable即可
public interface IUniqueNameSelectable extends Selectable, IUniqueName {
}
  1. 定义策略接口的实现类
@Service
public class UserUniqueNameService implements IUniqueNameSelectable {
    @Autowired
    UserPwdMapper userPwdMapper;
    @Override
    public String getServiceName() {
        return "User";
    }

    @Override
    public boolean isNameUnique(UniqueNameDto dto) {

        return userPwdMapper.countByName(dto.getName()) == 0;
    }
}
@Service
public class KeywordUniqueNameService implements IUniqueNameSelectable {
    @Autowired
    KnowledgeTypeMapper knowledgeTypeMapper;
    @Override
    public String getServiceName() {
        return "Keyword";
    }

    @Override
    public boolean isNameUnique(UniqueNameDto dto) {
        return knowledgeTypeMapper.countByName(dto.getName()) == 0;
    }

}
  1. 定义具体策略接口选择器,只需要继承抽象选择器ServiceSelector
    指定具体的策略接口,选择器自动将具体策略接口的实现类注册进来
@Component
public class UniqueNameSelector extends ServiceSelector<IUniqueNameSelectable> {
}
  1. 使用选择器:将选择器注入到对应服务中,通过getService获取到对应的策略接口的实现类
@Service
public class UniqueNameQueryService implements IUniqueNameQueryService {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(UniqueNameQueryService.class);
    @Autowired
    ServiceSelector<IUniqueNameSelectable> uniqueNameSelector;


    @Override
    public boolean isUniqueName(UniqueNameDto dto) {
        IUniqueName uniqueName = uniqueNameSelector.getService(dto.getTradeName());
        if (null != uniqueName){
            return uniqueName.isNameUnique(dto);
        }
        return false;
    }



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值