1.来活了
最近来了个给订单打标签的任务,大致功能是这样的,可支持给订单打标签,每个标签不仅是只打上一个label,还需要添加对应的备注,原因,反正就是不同的标签看似操作相同,但内部操作是可拓展的。
2.编码完毕
我一想这不简单吗?一下子写完了代码,就像这样,多个switch解决,之后再有标签就不断的在该类中加入private方法即可。
代码如下所示。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
public void addLabelOld(Integer labelCode) {
// 一个方法搞定
switch (labelCode) {
case 1:
// 促销订单
break;
case 2:
// 重要客户
break;
case 3:
// 优先处理
break;
}
}
public void removeLabelOld(Integer labelCode) {
// 一个方法搞定
switch (labelCode) {
case 1:
// 促销订单
break;
case 2:
// 重要客户
break;
case 3:
// 优先处理
break;
}
}
}
3.思考
但我转念一想,都工作好几年了,代码要写的可维护,这段代码不能说有功能问题,但不够好,我要追求的优雅些,且还有时间优化,不如搞一波新的吧。
4.重新设计
不是有那么多的switch嘛,天然可以用工厂方法来简化,于是就有了下面的一版。
4.1 添加移除标签接口类
public interface IOrderLabelService {
void add();
void remove();
}
4.2 标签接口实现类
/**
* 促销订单标签
*@author sharpbb 2024/8/21
*/
public class PromotionOrderServiceImpl implements IOrderLabelService{
@Override
public void add() {
}
@Override
public void remove() {
}
}
/**
* 重要客户标签
*@author sharpbb 2024/8/21
*/
public class ImportantCustomersServiceImpl implements IOrderLabelService{
@Override
public void add() {
}
@Override
public void remove() {
}
}
/**
* 优先处理订单
*@author sharpbb 2024/8/21
*/
public class PriorityProcessingServiceImpl implements IOrderLabelService{
@Override
public void add() {
}
@Override
public void remove() {
}
}
4.3 核心工厂类
通过该方法的map获取对应的service,方便调用。
/**
*@author sharpbb 2024/8/21
*/
@Component
public class OrderLabelBeanFactory {
// 在类初始化时,构建一个映射表
private final Map<Integer, Class<? extends IOrderLabelService>> serviceMap = new HashMap<>();
@PostConstruct
public void init() {
// 有其他标签则往下加 应该用枚举 这里省事了
//1.促销订单
//2.重要客户
//3.优先处理
serviceMap.put(1, PromotionOrderServiceImpl.class);
serviceMap.put(2, ImportantCustomersServiceImpl.class);
serviceMap.put(3, PriorityProcessingServiceImpl.class);
}
// 获取对应的订单标签实现类
public IOrderLabelService getOrderLabelService(Integer value) {
Class<? extends IOrderLabelService> serviceClass = serviceMap.get(value);
if (serviceClass != null) {
return SpringContextUtil.getBean(serviceClass);
} else {
throw new RuntimeException(StrUtil.format("未知的标签类型{},不支持!" , value));
}
}
}
4.4 service方法
只需要通过工厂方法传递code即可拿到对应实现,完成相应的调用。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderLabelBeanFactory orderLabelBeanFactory;
public void addLabelNew(Integer labelCode) {
IOrderLabelService orderLabelService = orderLabelBeanFactory.getOrderLabelService(labelCode);
orderLabelService.add();
}
public void removeLabelNew(Integer labelCode) {
IOrderLabelService orderLabelService = orderLabelBeanFactory.getOrderLabelService(labelCode);
orderLabelService.remove();
}
}
编码完毕,我嘻嘻一笑。
5.总结
这只是个小demo,但我认为通过该工厂设计模式能够很大程度的改善那些臃肿的代码,要知道,类并不值钱,多创建一些类来去耦合,是很必要的。