什么是策略模式?
官方曰:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化;
俗话曰:策略模式定义了一系列具有共同特征对象的某些行为(方法/函数),广义上来看,每个方法都是完成相同的工作,实际上每个方法执行的细节不一样,也就是具体实现不同,比方说:人吃饭这个行为,中国人用筷子和碗吃饭,而美国人用的是叉子和盘子吃饭,也有用竹筒盛饭吃的。。。。。。大家都是实现吃饭这个行为;而软件系统中为了减少具有共同特征和行为的对象之间的耦合度,实现对外统一对象的特征(方法),还是拿吃饭来说(本人好吃^_^,见谅):对外统一暴露吃饭方法,具体谁吃(也可以理解成中国人方式吃、还是美国人方式吃),那就是策略模式的核心所在,这个时候就需要策略管理器去动态调用具体方法实现了;就不说太多废话了,看例子:
流程图:
JAVA_CODE例子:
/*** 人类
* 对外统一入口
*@authorAdministrator
**/
public interfacePerson {//吃饭
public voideat();
}
/*** 鬼子
*@authorAdministrator*/@Componentpublic class JapanPerson implementsPerson {
@Overridepublic voideat() {
System.out.println("米西米西");
}
}
/*** 中国人
*@authorAdministrator
**/@Componentpublic class ChinesePerson implementsPerson {
@Overridepublic voideat() {
System.out.println("中国人在吃饭!");
}
}
/*** 米国人
*@authorAdministrator*/@Componentpublic class AmericanPerson implementsPerson {
@Overridepublic voideat() {
System.out.println("米国人在吃饭!");
}
}
/*** 人类策略管理器
*@authorAdministrator
**/@Componentpublic classPersonContext {/***使用线程安全的ConcurrentHashMap存储所有实现Person接口的Bean
*key:beanName
*value:实现Person接口Bean*/
private final Map personMap = new ConcurrentHashMap<>();/*** 注入所有实现Person的bean,全部存放personMap中,以实现动态调用
*@parampersonMap*/@Autowiredpublic PersonContext(MappersonMap) {this.personMap.clear();this.personMap.putAll(personMap);
}//行为方法
public voiddoEat(String value) {if(!StringUtils.isEmpty(value)){
personMap.get(value).eat();
}
}
}
@Controllerpublic classPersonController {
@AutowiredprivatePersonContext personContext;
@RequestMapping("eat")public @ResponseBody voideat(String value) {
personContext.doEat(value);
}
}
这样就可以实现动态调用,例如启动tomcat后访问: http://127.0.0.1:8080/item/eat?value=chiniesePerson就是调用中国人的吃饭行为;
总结: 策略模式有效的解决了具有共同行为的对象之间的耦合,这样才符合"对修改关闭,扩展开放"原则;
以下图是本人项目的具体应用场景,各位可以参考
-----------------------------------------------------------------------------------
本文仅供学习,如有不对地方,请留言指教!