目录
0.背景概述
每次重温陈道明老师出演的电视剧《楚汉传奇》都有一种让人热血沸腾的感觉,宏大的战争场面,上百万士兵的厮杀,决定一场战斗胜负的因素有很多。比如士兵的素质,士兵人数的寡众,兵器的优良,统帅的谋略等,而对于一场战斗胜负的关键除了这些因素之外还有应该就是在何时使用何种兵器来对敌也非常重要,古代兵器的分类比如长矛,弓箭,机弩,长剑等,在何种情况下使用何种兵器对敌,对于一场战争的胜负而言尤为重要。
在日常的软件设计中,我们也经常遇到类似的问题,对于同一个问题,在不同的场景下面可能有不同的解决方式,如何针对不同的场景优雅的切换解决策略是一个优秀的研发人员需要考虑的问题。在大部分的解决方案中,最多的就是在代码中使用if..else来判断(或者switch),如果我们需要增加一种场景支持就只能在原有的代码逻辑里面增加判断逻辑,长此以往,代码里面的判断会越来越多,不利于代码的易读性和可修改性,有没有一种更好的设计来支持这类问题呢,让具体的算法策略与使用对象分割开。策略模式应运而生。
1.策略模式简介
1.1 策略模式定义
策略模式:Strategy pattern,定义一个算法簇,将每一种算法单独封装起来,使他们在不同的场景下面可以相互替换,是得具体的算法可以与使用对象独立开来。
1.2 策略模式的UML结构图
Context:上下文环境保存类,维持了一个Strategy对象,外部对象执行某个具体策略的入口
Strategy:抽象策略接口,定义了一个算法簇的基本结构