首页 > 代码库 > 策略模式
策略模式
近期开始对自身开始巩固学习,先从设计模式开始。
策略,可以理解为对一个问题的解决方案的集成,用程序语言来描述的话,可以叫做一种算法。
对应的我可以想到的是Collections.sort方法
里面的算法我也看的晕乎乎
不过关键的点还是在于 Collections.sort的第二个参数,Comparator
public static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); }
注意这是一个接口,是一个接口,是一个接口!
好吧,反正这就是个回调接口,意思就是你告诉我怎么比较大小,我帮你排序。
这里的怎么比较大小就是一个算法。
而且是在动态运行过程中,你随时可以改变的,所以我们也把策略模式归为 行为类模式 -- 可在运行过程中改变自身行为。
不过到这,我们应该还是很模糊,究竟策略模式的表现是什么样的,这里我用不上工科生的方式解释,因为我也看不懂一堆理论公式的。
首先,我们要有个环境,因为没有环境的话,策略是没有依托的。我们这边就用个谋士的例子吧。
我们知道三国时期,刘备初期的谋士是徐庶。
后来曹操得知有这么个人才在敌人堆里,又打听到徐庶是个孝子,就把他母亲接过来,逼着徐庶跑到曹操阵营去了。
那么好了,这离职吧,得推荐个接班人吧。于是徐庶推荐了自己的好友:卧龙先生。
接着就是我们耳熟能详的三顾茅庐的故事啦。
这里其实体现了策略模式的几个特点:
- 需要在某个环境下(刘备阵营或曹操阵营)
- 得先知道有这个人,才能招吧?(不是徐庶推荐,刘备怎么会知道诸葛亮这人呢?)
- 不同时期,可以替换不同的对象
这边还是习惯性的用代码的简单Demo来表示下
package top.gabin.design.model.strategy; /** * 行为是 打扫房间 * * @author linjiabin on 2017/2/10 */ public interface CleanRoot { void clean(); }
package top.gabin.design.model.strategy; /** * @author linjiabin on 2017/2/10 */ public class Mother implements CleanRoot { @Override public void clean() { System.out.println("妈,我的袜子哪去啦"); } }
package top.gabin.design.model.strategy; /** * 家政人员 * * @author linjiabin on 2017/2/10 */ public class Housekeeping implements CleanRoot { @Override public void clean() { System.out.println("好干净啊!一尘不染!"); } }
package top.gabin.design.model.strategy; /** * 程序员,是我 * * @author linjiabin on 2017/2/10 */ public class Programmer implements CleanRoot { @Override public void clean() { System.out.println("额,老公,你是拿扫把扫了一下地吗?"); } }
package top.gabin.design.model.strategy; /** * * @author linjiabin on 2017/2/10 */ public class MyWife { private static CleanRoot cleaner; public static void main(String[] args) { cleaner = new Programmer(); cleaner.clean(); cleaner = new Mother(); cleaner.clean(); cleaner = new Housekeeping(); cleaner.clean(); } }
执行一下:
额,老公,你是拿扫把扫了一下地吗?
妈,我的袜子哪去啦
专业的就是不一样,打扫的好干净啊!一尘不染!
在要打扫屋子的这个事件中,老婆手头上有这几个人可以使唤,最容易的是老公程序员,然后是老妈,最后是家政人员,要钱!其次,他们都懂得打扫房间(只是……)所以,用一下先,不好再换咯。
这就是我理解中的策略模式~
策略模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。