这篇文章主要讲解了“Java策略模式实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java策略模式实例分析”吧!
1.算法可以自由切换。
2.避免使用多重条件判断。
3.扩展性良好。
1.策略类会增多。
2.所有策略类都需要对外暴露。
1.如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2.一个系统需要动态地在几种算法中选择一种。
3.如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
假设一个场景,我们在电商系统中,订单分为很多种,例如:普通订单,秒杀订单,拼团订单等等。我们需要创建一个订单的时候,由于订单的类型不同,我们需要根据订单的类型执行不同的业务逻辑。
package com.asurplus.common.strategy;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 订单类型枚举类
*/
@Getter
@AllArgsConstructor
public enum OrderTypeEnum {
COMMON(1001, "普通订单"),
SECKILL(1002, "秒杀订单"),
SPELL(1003, "拼团订单");
int type;
String desc;
}
我们的订单分为三种,普通订单,秒杀订单,拼团订单。
package com.asurplus.common.strategy;
/**
* 订单处理接口
*/
public interface OrderService {
/**
* 创建订单
*
* @return
*/
void createOrder();
/**
* 获取订单类型
*
* @return
*/
OrderTypeEnum type();
}
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 普通订单处理器
*/
@Slf4j
@Service
public class CommonOrderServiceImpl implements OrderService {
@Override
public void createOrder() {
log.info("创建 普通订单");
}
@Override
public OrderTypeEnum type() {
return OrderTypeEnum.COMMON;
}
}
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 秒杀订单处理器
*/
@Slf4j
@Service
public class SeckillOrderServiceImpl implements OrderService {
@Override
public void createOrder() {
log.info("创建 秒杀订单");
}
@Override
public OrderTypeEnum type() {
return OrderTypeEnum.SECKILL;
}
}
package com.asurplus.common.strategy;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
/**
* 拼团订单处理器
*/
@Slf4j
@Service
public class SpellOrderServiceImpl implements OrderService {
@Override
public void createOrder() {
log.info("创建 拼团订单");
}
@Override
public OrderTypeEnum type() {
return OrderTypeEnum.SPELL;
}
}
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;
/**
* 订单管理器
*/
@Component
public class OrderManager {
/**
* Autowired 注解的强大之处
*/
@Autowired
private List<OrderService> orderServices;
/**
* 创建订单
*
* @param type 订单类型
* @return
*/
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 的强大之处,可以一次性自动注入多个对象。根据订单类型,选出对应的处理器来处理该订单。
<!-- 测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
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)
@SpringBootTest
public class TestMain {
@Autowired
private OrderManager orderManager;
@Test
public void test() {
// 创建 秒杀订单
orderManager.createOrder(OrderTypeEnum.SECKILL.getType());
}
}
输出结果
感谢各位的阅读,以上就是“Java策略模式实例分析”的内容了,经过本文的学习后,相信大家对Java策略模式实例分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。