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