策略模式 示例说明

为工作中避免使用大量的if-else,而使用策略模式:

1.提供一个公共的方法入口

2.定义自己想要实现的实现类(实现类会有多种)

3.实现类注上指定的ServiceID,入口根据不同的传参,进入不同的实现类

示例代码如下:

1. 首先定义多个唯一的ServiceId,用于标注不同的实现类

public interface ServiceCode {

    /**
     * 自定义Service编码1
     */
    String SERVICE_ONT = "SERVICE_ONT";

    /**
     * 自定义Service编码2
     */
    String SERVICE_TWO = "SERVICE_TWO";
}

2. 定义可执行各种实现类的接口,注意! 这里的接口是泛型的,使用泛型的好处是可以根据不同需要,执行不同效果;

public interface DoService<T> {

    /**
     * 开始执行各种自己定义的类
     * @param modifyReqVO
     */
    void doSomeThing(List<T> modifyReqVO);
}

3. 定义公共方法入口和其实现类,这里就是一个策略模式的中转站,也是其核心所在,因为所有的方法都会从already进入,通过serviceMap得到不同的实现类对象;

public interface AlreadyService {

    /**
     * 策略模式的方法入口
     * @param serviceCode 服务编码
     * @param modifyReqVO 泛型入参
     * @param <T>
     */
    <T> void already(String serviceCode, List<T> modifyReqVO);
}
@Service
public class CommonAlreadyServiceImpl implements AlreadyService {

    // 通过注解的方法,初始化serviceMap, 注入(实现DoService方法的定义类)服务编码 以及 定义类的地址
    @Autowired
    private Map<String, DoService> serviceMap;

    @Override
    public <T> void already(String serviceCode, List<T> modifyReqVO) {
        // 根据服务编码获取实现类
        DoService doService = serviceMap.get(serviceCode);
        // 执行自定义实现类
        doService.doSomeThing(modifyReqVO);
    }
}

3. 定义自己想要的实现类(此外我定义了抽象类,把可用复用的方法,封装到抽象类中,再通过实现类继承抽象父类,调用可复用的方法),继承了抽象父类(可要可不要),实现了DoService接口,也就是执行类的接口

自定义类1:这里我的DoService<T> 里面放的是AdminMenu这个实体类,可根据需要自定义

@Service(ServiceCode.SERVICE_ONT)// 自定义服务编码
public class ActionOneServiceImpl extends AbstractFatherService 
implements DoService<AdminMenu> {

    @Override
    public void doSomeThing(List<AdminMenu> modifyReqVO) {
        System.out.println("进入actionOne");
        // 调用抽象类的方法(这里可以把一些通用的方法写到抽象类封装起来)
        test1();
        System.out.println(modifyReqVO.toString());
    }
}

自定义类2:这里我的DoService<T> 里面放的是Book这个实体类,可根据需要自定义

@Service(ServiceCode.SERVICE_TWO)
public class ActionTwoServiceImpl extends AbstractFatherService 
implements DoService<Book> {
    @Override
    public void doSomeThing(List<Book> modifyReqVO) {
        System.out.println("进入actionTwo");
        test2();
    }
}

以上是一个小的demo,测试的时候最好使用接口去调用,而不是直接用main方法,不然@Audowired注解会失效的;

测试:

@RestController
public class TestController {

    @Autowired
    private CommonAlreadyServiceImpl service;

    @GetMapping("/api/test")
    public void test() {
        List<AdminMenu> modifyReqVO  = new ArrayList<>();
        AdminMenu adminMenu = new AdminMenu();
        adminMenu.setComponent("111");
        adminMenu.setName("方法One");
        modifyReqVO.add(adminMenu);
        // 这里的ServiceID 根据不同实现类传入
        service.already(ServiceCode.SERVICE_ONT, modifyReqVO);
    }
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值