这篇文章主要讲解了“Java策略模式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java策略模式实例分析”吧!
优点
算法可以自由切换。
避免使用多重条件判断。
扩展性良好。
缺点
策略类会增多。
所有策略类都需要对外暴露。
使用场景
如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一种。
如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
一、实现方式
假设一个场景,我们在电商系统中,订单分为很多种,例如:普通订单,秒杀订单,拼团订单等等。我们需要创建一个订单的时候,由于订单的类型不同,我们需要根据订单的类型执行不同的业务逻辑。
1、订单类型枚举类
package com.asurplus.common.strategy;import lombok.AllArgsConstructor;import lombok.Getter;@Getter@AllArgsConstructorpublic enum OrderTypeEnum { COMMON(1001, "普通订单"), SECKILL(1002, "秒杀订单"), SPELL(1003, "拼团订单"); int type; String desc;}
我们的订单分为三种,普通订单,秒杀订单,拼团订单。
2、订单处理接口
package com.asurplus.common.strategy;public interface OrderService { void createOrder(); OrderTypeEnum type();}
3、普通订单处理器
package com.asurplus.common.strategy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;@Slf4j@Servicepublic class CommonOrderServiceImpl implements OrderService { @Override public void createOrder() { log.info("创建 普通订单"); } @Override public OrderTypeEnum type() { return OrderTypeEnum.COMMON; }}
4、秒杀订单处理器
package com.asurplus.common.strategy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;@Slf4j@Servicepublic class SeckillOrderServiceImpl implements OrderService { @Override public void createOrder() { log.info("创建 秒杀订单"); } @Override public OrderTypeEnum type() { return OrderTypeEnum.SECKILL; }}
5、拼团订单处理器
package com.asurplus.common.strategy;import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Service;@Slf4j@Servicepublic class SpellOrderServiceImpl implements OrderService { @Override public void createOrder() { log.info("创建 拼团订单"); } @Override public OrderTypeEnum type() { return OrderTypeEnum.SPELL; }}
6、下单管理器
package com.asurplus.common.strategy;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.List;import java.util.Optional;@Componentpublic class OrderManager { @Autowired private List<OrderService> orderServices; public void createOrder(int type) { Optional<OrderService> any = orderServices.stream().filter(f -> f.type().getType() == type).findAny(); if (!any.isPresent()) { throw new RuntimeException("没有找到相应的订单实现"); } // 创建订单 any.get().createOrder(); }}
这里就能体现出 @Autowired 的强大之处,可以一次性自动注入多个对象。根据订单类型,选出对应的处理器来处理该订单。
二、测试
1、引入依赖
<!-- 测试依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId></dependency>
2、测试用例
package com.asurplus.common.strategy;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class TestMain { @Autowired private OrderManager orderManager; @Test public void test() { // 创建 秒杀订单 orderManager.createOrder(OrderTypeEnum.SECKILL.getType()); }}
输出结果
感谢各位的阅读,以上就是“Java策略模式实例分析”的内容了,经过本文的学习后,相信大家对Java策略模式实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!