前言:
之前写过一个工作中常见升级模式-策略模式 的文章,里面讲了具体是怎样使用策略模式去抽象现实中的业务代码,今天来拿出实际代码来写个demo,这里做个整理来加深自己对策略模式的理解。
一、业务流程
取消订单会有多种情况,比如:取消即时订单、取消预约订单、取消拼车订单
一般业务代码中我们会根据取消类型来进行不同的逻辑处理,代码中无外乎多了很多if else的业务逻辑,且代码耦合度很高。
二、流程图
上面已经说了业务流程,当然有流程图才是最直观的,这里我们可以直接参见下图:
aaarticlea/png;base64,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" alt="" width="603" />
这里我们可以使用Spring 获取到所有 AbstractOrderStrategy 实现类中@OrderTypeAnnotation注解的类,然后比较orderType即可。下面就看具体代码吧;
三、代码实现及解析
1、自定义订单类型枚举:OrderTypeAnnotation
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface OrderTypeAnnotation {
OrderTypeEnum orderType();
}
这里 ElementType.TYPE表示用于类上,RetentionPolicy.RUNTIME 表示运行时解析的。更多的含义大家可以看注解的相关知识。
2、构建OrderType枚举:OrderTypeEnum
public enum OrderTypeEnum {
INSTANT(1, "即时订单"),
BOOKING(2, "预约订单"),
CARPOOL(3, "拼车订单");
private int code;
private String desc;
OrderTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static OrderTypeEnum getByCode(int code) {
for (OrderTypeEnum orderTypeEnum : values()) {
if (orderTypeEnum.getCode() == code) {
return orderTypeEnum;
}
}
return null;
}
}
这里会显示该取消订单的类型,如过往代码中所有if 中的条件判断,这里用枚举进行归纳。
3、构建抽象策略及策略实现类
策略抽象类:AbstractOrderStrategy
public abstract class AbstractOrderStrategy {
/**
* 策略抽象方法
* @param orderDTO
*/
abstract public void process(OrderDTO orderDTO);
}
为了容易理解,这里只有一个业务实现类,继承该抽象类的策略类都会实现具体的业务。
预约单处理策略类:BookingOrderStrategy
@Service
@OrderTypeAnnotation(orderType = OrderTypeEnum.BOOKING)
public class BookingOrderStrategy extends AbstractOrderStrategy {
@Override
public void process(OrderDTO orderDTO) {
System.out.println("取消预约订单");
}
}
这里重点关注orderType,代码区分具体的执行策略 都是通过这个type去进行处理的。
即时单处理策略类:InstantOrderStrategy
@Service
@OrderTypeAnnotation(orderType = OrderTypeEnum.INSTANT)
public class InstantOrderStrategy extends AbstractOrderStrategy {
@Override
public void process(OrderDTO orderDTO) {
System.out.println("取消即时订单");
}
}
4、策略分发处理类
这个类主要是接收业务请求,然后转发到具体的策略类进行处理,这里使用到了spring 获取具体的类,然后通过类上面的注解信息进行转发。
@Service
@Slf4j
public class CancelOrderStrategyService {
/**
* 处理取消逻辑
*/
public void process(OrderDTO orderDTO) {
Map<String, AbstractOrderStrategy> beanMap = SpringBeanUtils.getBeanMap(AbstractOrderStrategy.class);
try {
for (Map.Entry<String, AbstractOrderStrategy> entry : beanMap.entrySet()) {
Object real = SpringBeanUtils.getTarget(entry.getValue());
OrderTypeAnnotation annotation = real.getClass().getAnnotation(OrderTypeAnnotation.class);
if (orderDTO.getServiceType() == annotation.orderType().getCode()) {
entry.getValue().process(orderDTO);
break;
}
}
} catch (Exception e) {
log.error("获取目标代理对象失败:{}", e);
}
}
}
其中:
Map<String, AbstractOrderStrategy> beanMap = SpringBeanUtils.getBeanMap(AbstractOrderStrategy.class);
代表获取AbstractOrderStrategy 下全部子类或接口。
Object real = SpringBeanUtils.getTarget(entry.getValue());
代表获取具体的代理类
OrderTypeAnnotation annotation = real.getClass().getAnnotation(OrderTypeAnnotation.class);
代表取类上有OrderTypeAnnotation 的注解信息。
CancelOrderStrategyService.process() 这个方法是可以扩展的,通过外部传入的class信息来获取具体的代理类。
5、Spring获取bean工具类
@Component
public class SpringBeanUtils implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
if (applicationContext == null) {
applicationContext = context;
}
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(Class<T> clazz) {
return applicationContext.getBean(clazz);
}
/**
* 获取类型为requiredType的Map
*
* @param clazz
* @return
*/
public static <T> Map<String, T> getBeanMap(Class<T> clazz) {
return applicationContext.getBeansOfType(clazz);
}
/**
* 获取 目标对象
*
* @param proxy 代理对象
* @return 目标对象
* @throws Exception
*/
public static Object getTarget(Object proxy) throws Exception {
if (!AopUtils.isAopProxy(proxy)) {
// 不是代理对象,直接返回
return proxy;
}
if (AopUtils.isJdkDynamicProxy(proxy)) {
return getJdkDynamicProxyTargetObject(proxy);
} else {
// cglib
return getCglibProxyTargetObject(proxy);
}
}
private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {
Field field = proxy.getClass().getSuperclass().getDeclaredField("h");
field.setAccessible(true);
AopProxy aopProxy = (AopProxy) field.get(proxy);
Field advised = aopProxy.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget();
return target;
}
private static Object getCglibProxyTargetObject(Object proxy) throws Exception {
Field field = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");
field.setAccessible(true);
Object dynamicAdvisedInterceptor = field.get(proxy);
Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");
advised.setAccessible(true);
Object target = ((AdvisedSupport) advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();
return target;
}
}
6、添加单元测试
public class CancelAbstractOrderStrategyTest extends BaseTest {
@Autowired
private CancelOrderStrategyService cancelOrderStrategyService;
@Test
public void process() {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setServiceType(OrderTypeEnum.INSTANT.getCode());
cancelOrderStrategyService.process(orderDTO);
}
}
7、打印结果:
到了这里代码就已经写完了,如果仔细看的话 应该会明白这里的设计思路,通过策略模式+注解 可以大大的降低业务的耦合度,而且也极大的方便了后期维护的工作量。
- 策略模式在PHP业务代码的实践
[大话设计模式]-- 策略者模式(Strategy):它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变法,不会影响到使用算法的客户. 策略模式的核心就是屏蔽内部策略算法,内部的 ...
- 利用设计模式消除业务代码中的 if-else
准备工作:假设这样的一个业务场景:有一个自动开票的功能需要实现,在程序里面需要根据账单的类型执行对应的处理逻辑. 以下使用了 Lombok 简化代码!!! 账单类型枚举: /** * @author ...
- Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句)
Java-Annotation的一种用法(消除代码中冗余的if/else或switch语句) 1.冗余的if/else或switch 有没有朋友写过以下的代码结构,大量的if/esle判断,来选择 ...
- 使用策略模式重构switch case 代码
目录 1.背景 2.案例 3.switch…case…方式实现 4.switch…case…带来的问题 5.使用策略模式重构switch…case…代码 6.总结 1.背景 之前在看<重构 ...
- JVM 性能调优实战之:使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码
本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 提升到 20 (提升了 7 倍) ...
- 使用阿里开源工具 TProfiler 在海量业务代码中精确定位性能代码 (jvm性能调优)
技术交流群:233513714 本文是<JVM 性能调优实战之:一次系统性能瓶颈的寻找过程> 的后续篇,该篇介绍了如何使用 JDK 自身提供的工具进行 JVM 调优将 TPS 由 2.5 ...
- (转)刚来的大神彻底干掉了代码中的if else...
一旦代码中 if-else 过多,就会大大的影响其可读性和可维护性. 首先可读性,不言而喻,过多的 if-else 代码和嵌套,会使阅读代码的人很难理解到底是什么意思.尤其是那些没有注释的代码. 其次 ...
- 策略模式原理及Java代码实例
一.策略模式的定义 —— 定义了一组算法,将每个算法包装起来,并且使它们之间可以互换 —— 策略模式使这些算法在客户端调用它们的时候能够相互不影响的变化,改变不同算法的实现方式不影响客户端的使用,即策 ...
- java线程基础巩固---策略模式在Thread和Runnable中的应用分析
在上篇[http://www.cnblogs.com/webor2006/p/7709647.html]中已经学习了Runnable出现的好处,其实这种设计是采用的一种策略模式,所以为了进一步理解Ru ...
随机推荐
- android ——调用摄像头拍照和相册
先在布局文件中加入两个按钮和一个图片控件 <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...
- 状压DP概念 及例题(洛谷 P1896 互不侵犯)
状压DP 就是状态压缩DP.所谓状态压缩,就是将一些复杂的状态压缩起来,一般来说是压缩为一个二进制数,用01来表示某一元素的状态. 比如一排灯泡(5个) 我们可以用一串二进制01串来表示他们的状态 1 ...
- Spring 2017 Assignments3
一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment3/ 翻译:http://www.mooc.ai/course/268/lear ...
- (十九)c#Winform自定义控件-停靠窗体
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- Javascript十大排序算法的实现方法
上一篇中,实现了Javascript中的冒泡排序方法,下面把剩余的九种排序算法实现 选择排序: var array = []; for(var i=0;i<100000;i++){ var x ...
- Windows Server 2008磁盘管理
下面学习一下磁盘管理,基本磁盘 分区 空间只能是同一块磁盘的空间,动态磁盘 卷 空间可以是多块硬盘上的空间,怎么创建 RAID-0 条带卷 读写快 无容错 适合存放不太重要的数据 ,RAID-1 ...
- 你是否真的了解全局解析锁(GIL)
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- linux下python中文乱码解决方案
1. 场景描述 linux服务器下安装了Anaconda3,执行Pyhton的K-means算法,结果出现如下图的中文字符乱码.上次已经解决了,忘记记录解决流程了,这次配置了一台新的服务器,又出现,默 ...
- 随笔编号-08 MYSQL 存储过程,5分钟执行调用过程;
delimiter //DROP PROCEDUREIF EXISTS jdt.day_instan_data_task// CREATE PROCEDURE jdt.day_instan_data_ ...
- Python源码学习Schedule
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...