使用场景
在工作中,根据不通的类型的用户,不停的使用if-else,非常繁琐,程序模块间的耦合程度较大,业务逻辑难以切分,后期维护比较难以拆分
设计模式如何使用
设计模式需要使用到的有:
1.公共接口:用于定义公共的接口
2.公共接口实现:对公共接口的具体实现方式
3.调用接口实现类的环境:具体调用接口的场景执行相应的策略方法实现
4.工厂模式:用于产生不同的策略(可选)
代码如下:
- 公共接口:
/**
* 申请单策略接口
*/
public interface AppFormStrategy {
/**
* 申请单导入零件:策略公共接口
* @param datas
* @param appFormId
* @return
*/
List<String> doImportItems(List<Map<String, Object>> datas, Long appFormId);
- 接口实现类
每个实现类的具体业务是不一样的,比如校验规则
实现类1
@Service("appFormStrategy1")
public class AppFormStrategy1Impl implements AppFormStrategy {
/**申请单实现方式,
*/
public List<String> doImportItems(List<Map<String, Object>> dataMapList, Long appFormId) {
//你的业务代码。。。。。。。
//比如校验
//导入数据等
return erroList;
}
实现类2
@Service("appFormStrategy2")
public class appFormStrategy2Impl implements AppFormStrategy {
@Override
public List<String> doImportItems(List<Map<String, Object>> dataMapList, Long appFormId) {
//你的业务代码。。。。。。。
//比如校验
//导入数据等
return erroList;
}
- 策略环境
加载具体的策略
/**
* 申请单环境:用于接收不同的申请单
*/
public class AppFormContext{
AppFormStrategy appFormStrategy;
/**初始化策略
* 根据不通的type,从Spring中加载实例
* 工厂模式,获取相应的策略
*/
public AppFormContext(String appFormType) {
if(StringUtils.equals(appFormType, "type1")){
appFormStrategy = (AppFormStrategy) SpringContextUtil.getBean("appFormStrategy1");
}else if(StringUtils.equals(appFormType, "type2")){
appFormStrategy = (AppFormStrategy) SpringContextUtil.getBean("appFormStrategy2");
}
}
/** 被外部调用
*/
public List<String> doForm(List<Map<String, Object>> datas,Long appFormId){
return appFormStrategy.doImportItems(datas,appFormId);
}
}
- 外部调用策略模式:
//部分涉及业务隐私场景代码这里就不写了,直接main函数就可以了
//给环境中传入类型,获取相应的策略
AppFormContext context = new AppFormContext(appFormType);
//执行策略
context.doForm(list,appFormId);
5.总结:
以上是自己对策略模式的一些见解,如果有不同的见解,欢迎批评指正