代码重构之Spring+工厂+策略模式
来源:互联网 发布:淘宝商城怎么开店 编辑:程序博客网 时间:2024/05/28 23:10
策略模式定义
将一组算法封装到实现共同接口的独立类中,使得它们可以相互替换。
策略举例
项目中执行需求:有关类型1的需求,由A做;类型2的需求,由B做;类型3的需求,由C做。
代码实现
public void doItem(int type) { if (type == 1) { // do action workA(); System.out.println("A do work."); } else if (type == 2) { // do action workB(); System.out.println("B do work."); } else if (type == 3) { // do action System.out.println("C do work."); } else { // do action workC(); System.out.println("do it yourself."); } }
我们最快想到的,就是if…else…或者case。大多数情况下,这样是合理的。
但是,如果type越来越多,action越来越复杂,doItem方法就会变得越来越庞大,代码的可读性也就会越来越差。
下面,介绍一下前段时间在项目中的一次重构经历,主要用到策略模式。
策略模式简单示例
// 定义策略接口 public interface Strategy { public void work(); } // 策略A public class StrategyA implements Strategy { @Override public void work() { System.out.println("A do work."); } } // 策略B public class strategyB implements Strategy { @Override public void work() { System.out.println("B do work."); } } // 策略C public class strategyC implements Strategy { @Override public void work() { System.out.println("C do work."); } } // 环境类 public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy = strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void work() { this.strategy.work(); } } public void doItem() { Context ct = new Context(new StrategyA()); ct.work(); ct.setStrategy(new StrategyB()); ct.work(); }
项目重构实战
原部分代码
public void pushData2Sap(String type, List<Long> ids) { Object[] dtos = null; if (type.equals("customer")) { List<CustomerDTO> dtoList = customerService.query(ids); dtos = new Object[dtoList.size()]; dtos = dtoList.toArray(); } else if (type.equals("product")) { List<ProductDTO> dtoList = new ArrayList<ProductDTO>(); for (Long id : ids) { ProductDTO d = productService.queryById(id); dtoList.add(d); } dtos = new Object[dtoList.size()]; dtos = dtoList.toArray(); } else if (type.equals("provider")) { List<ProviderDTO> dtoList = providerService.query(ids); dtos = new Object[dtoList.size()]; dtos = dtoList.toArray(); } else if (type.equals("contact")) { List<ContactDTO> dtoList = contactService.query(ids); dtos = new Object[dtoList.size()]; dtos = dtoList.toArray(); } RedisHelper.push(dtos); }
Spring + 工厂 + 策略模式重构后
// applicationContext-bean.xml <!-- 推送sap策略工厂 --> <bean id="contextSpringFactory" class="core.util.ContextSpringFactory"> <property name="stgMap"> <map> <entry key="customer" value-ref="customerServiceImpl"/> <entry key="product" value-ref="productServiceImpl"/> <entry key="provider" value-ref="providerServiceImpl"/> <entry key="contact" value-ref="contactServiceImpl"/> </map> </property> </bean> // 策略工厂 @Component public class ContextSpringFactory { private Map<String, IPushSapStrategy<?>> stgMap = new HashMap<String, IPushSapStrategy<?>>(); public Map<String, IPushSapStrategy<?>> getStgMap() { return stgMap; } public void setStgMap(Map<String, IPushSapStrategy<?>> stgMap) { this.stgMap = stgMap; } public List<?> doAction(String strType, List<Long> ids) { return this.stgMap.get(strType).querySapObjs(ids); } } // RedisHelper // 引入策略工厂 @Resource private ContextSpringFactory contectSpringFactory; public void pushData2Sap(String type, List<Long> ids) { List<?> sapDtos = contectSpringFactory.doAction(typeId, ids); Object[] dtos = dtoList.toArray(); RedisHelper.push(dtos); }
这样,利用Spring+工厂模式+策略模式完成了代码重构
阅读全文
1 0
- 代码重构之Spring+工厂+策略模式
- 工厂方法重构策略
- 【机房重构】策略模式之下机
- 【读书笔记-重构与模式】设计模式之简单工厂模式、工厂模式、抽象工厂
- Spring之工厂模式
- Spring之工厂模式
- 设计模式之简单工厂模式,工厂模式,策略模式
- 代码重构 - 表驱动和工厂模式结合
- 工厂模式与策略模式之区别
- 使用工厂模式和策略模式重构复杂业务逻辑
- 机房重构利用策略模式+简单工厂实现消费金额的计算
- 【机房重构】——策略模式+简单工厂计算消费
- PHP 单例模式 工厂模式 策略模式代码理解
- 机房收费系统重构之策略模式
- 【机房重构】策略模式
- spring学习之工厂模式
- 设计模式学习之简单工厂模式和策略模式
- 设计模式之简单工厂模式和策略模式总结
- Rhyme/Spring5.0.2.RELEASE官方英文文档学习笔记(1) Introduction to the Spring IoC container and beans
- 数据库连接池
- [Java数据结构]简单排序之插入排序
- 用java计算一个目录里所有文件的大小
- HDU 5916
- 代码重构之Spring+工厂+策略模式
- JS——事件冒泡(1)
- c++中的处理类型的三种方式
- 爬虫实战:基于 HtmlParser 实现网页链接的提取
- matlab中num2str
- qt编译caffe遇到的opencv版本问题
- JAVA_String之trim()源码
- 【操作系统】死锁
- Java小面试题(4)