策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

老王最近接到一个工作,上级领导安排他对大家进行一次关于设计模式的科普培训。小蔡被安排座位老王的助手,一起准备这次培训。

小蔡以前从来不知道什么叫做设计模式,一听就感觉高深莫测,有一种不明觉厉的感觉。

于是小蔡问老王:“老王啊,什么叫做设计模式呢?”

老王回答:“设计模式,简单来将,就是一套经验,一套总结,没什么玄乎的。不过学了设计模式之后,对我们未来的工作是大有好处的。”

小蔡接着问:“那你先给我讲讲呗,我作为助手,什么都不知道,这让别人指导了,可就丢脸了。”

老王说:“好啊, 那我们今天先来说说策略模式吧。策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。”

小蔡两眼直发愣:“老王,你说的都是些啥,火星语吗?完全听不懂。”

老王说:“先别着急,刚只是跟你说了一下策略模式的定义,接下来给你举一个例子,你就明白了。对了,你知道咱们公司人称“冰雪美人”的程妹妹最喜欢吃什么不?”

小蔡单手一辉说:“她啊。最喜欢吃火锅,不过她的口味可是很挑剔的,咋的?你对她有意思?”

老王没有瞧小蔡,接着说:“好的,她喜欢吃火锅,而且口味挑剔。那好,我用策略模式来满足她喜欢吃火锅的要求。”

小蔡一下兴奋起来:“吃个火锅都能和设计模式联系起来?”

老王接着说:“假设公司里的张董想要追求程妹妹,想请程妹妹到家里吃火锅。张董得先请一个厨师,对吧?那么我们就来定义一个接口,告诉张董什么叫做厨师。”

//这是一个厨师
public interface Cook {//是厨师就得会做火锅HotPot cook();
}

小蔡打趣道:“张董还不知道厨师是干嘛的?需要我们告诉他吗?”

老王白了小蔡一眼,接着说:“张董现在知道什么是厨师了。于是张总按照这个标准到厨师学校去找厨师,到了厨师学校,他发现了三个厨师,一个四川厨师,一个北京厨师,一个潮汕厨师。”

//北京厨师
public class CookOfBeijing implements Cook {//北京厨师做的就是北京火锅@Overridepublic HotPot cook() {HotPotOfBeijing hotPot = new HotPotOfBeijing();return hotPot;}
}//潮汕厨师
public class CookOfChaoshan implements Cook {//潮汕厨师做的就是潮汕火锅@Overridepublic HotPot cook() {HotPotOfChaoshan hotPot = new HotPotOfChaoshan();return hotPot;}
}//四川厨师
public class CookOfSichuan implements Cook {//四川厨师做的就是四川火锅@Overridepublic HotPot cook() {HotPotOfSichuan hotPot = new HotPotOfSichuan();return hotPot;}
}

小蔡留着口水问:“原来火锅也分地区的啊?那这些火锅有什么区别呢?”

老王习惯性的呷了一口茶后说:“别着急,你不知道他们的区别,咱们张董也不知道呢,我们继续来看看这些火锅有些什么区别和特点。”

//北京火锅
public class HotPotOfBeijing extends HotPot {//北京老火锅,可是铜火锅,以前皇帝都用这个。public HotPotOfBeijing() {super("铜火锅啊~铜火锅~");}
}//潮汕火锅
public class HotPotOfChaoshan extends HotPot{//潮汕的牛肉火锅,味道鲜香棒public HotPotOfChaoshan() {super("吃牛肉啊~吃牛肉~");}
}//四川火锅
public class HotPotOfSichuan extends HotPot{//四川火锅的特点是:麻辣烫public HotPotOfSichuan() {super("麻辣烫啊~麻辣烫~");}
}

小蔡:“现在火锅的特点知道了,厨师也有了,然后开始做火锅了?”

老王:“厨师有了。火锅知道了。但是还需要一个东西,才能做火锅,那就是厨房,对吧?我们来看看厨房是什么样的。”

//厨房,做火锅的地方
public class Kitchen {//掌勺的主厨private Cook cook;//厨师进厨房了public Kitchen(Cook cook) {super();this.cook = cook;}//开工,做一个火锅出来public HotPot cook(){return cook.cook();}
}

小蔡打断了老王:“老王,现在厨师,厨房,火锅全有了,听得我肚子都饿了,但是我们要讲的策略模式在哪里呢?”

老王又呷了一口茶,说:“别着急嘛,准备工作做好了,接下来我们就开始吃火锅,哦,不对,应该是让张董去追程妹妹,追程妹妹总得讲点策略吧。这就是我们要讲的策略模式了。”

//开始追求程妹妹
public class Chasing {//追求活动public static void main(String[] args) {//叫来北京厨师CookOfBeijing cookOfBeijing = new CookOfBeijing();//让北京厨师进厨房Kitchen kitchen = new Kitchen(cookOfBeijing);//做出北京火锅HotPot hotPot = kitchen.cook();//问问程妹妹是否喜欢北京火锅//结果发现程妹妹不喜欢北京火锅//叫来潮汕厨师CookOfChaoshan cookOfChaoshan = new CookOfChaoshan();//让潮汕厨师进厨房kitchen = new Kitchen(cookOfChaoshan);//做出潮汕火锅hotPot = kitchen.cook();//问问程妹妹是否喜欢潮汕火锅//结果发现程妹妹不喜欢潮汕火锅//叫来四川厨师CookOfSichuan cookOfSichuan = new CookOfSichuan();//让潮汕厨师进厨房kitchen = new Kitchen(cookOfSichuan);//做出潮汕火锅hotPot = kitchen.cook();//问问程妹妹是否喜欢四川火锅//发现程妹妹很喜欢四川火锅//于是张董和程妹妹开始开心的吃火锅//一直吃到23:26//然后出去散步,看午夜场电影………………}
}

老王又呷了一口茶,说道:“小蔡,你看,这就是策略模式。首先定义一个接口,这就相当于是制定了一条策略,然后依照这个策略编写不同的实现类,就相当于一条策略有不同的实施办法。这个模式的优势在于可以动态的改变对象的行为。再聚个例子,比如京东针对它的会员,有不同的会员算法,比如金牌会员算法,银牌会员算法,铜牌会员算法。这就是针对会员算法这一个固定的策略,有了不同的实现。”

小蔡投来羡慕的目光:“老王,你真是太有才了。这样的例子,我能懂,不过我还有点迷糊,不知道策略模式该如何去做,你能帮我归纳一下吗?”

老王:“可以啊。策略模式主要有3个角色,1.环境类(Context):就是刚才说道的厨房。2. 抽象策略类(Strategy):这个是厨师接口。具体策略类(ConcreteStrategy):这就是那三个厨师。我们用一个图来表示,能够更加清晰易懂。”

小蔡:“老王,我发现另一个事儿。”

老王:“什么事儿?”

小蔡:“我肚子饿了。今天你得请我吃火锅。”

老王:“好好好,走嘛,今天晚上我们吃火锅。吃完之后,我们也去看一场电影哇?”

小蔡:“那得看火锅好不好吃了。哈哈”

  • 老王讲设计模式(一)——策略模式
  • 老王讲设计模式(二)——代理模式
  • 老王讲设计模式(三)——单例模式
  • 老王讲设计模式(四)——多例模式

更多内容,正在赶来,敬请关注“小蔡和老王的技术日常”。
PS:小蔡和老王的技术日常,已经建立QQ群,QQ群号:261434596,欢迎加入。。

转载于:https://www.cnblogs.com/wisekingokok/p/6277845.html

老王讲设计模式(一)——策略模式相关推荐

  1. 老王讲设计模式(八)——适配器模式

    适配器模式,是作为两个不兼容的接口之间的桥梁.这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能. 公司的发展速度很快,一不小心,就收购了一个创业团队去做细分市场.这么一个改变,对于公司来说 ...

  2. 老王讲设计模式(三)——单例模式

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 早晨,老王来到公司,发现小蔡正对着电脑屏幕发呆,于是走到小蔡身后,发现小 ...

  3. 研磨设计模式之 策略模式--转

    http://www.uml.org.cn/sjms/201009092.asp 研磨设计模式之 策略模式   2010-09-09 作者:云飞龙行 来源:云飞龙行的blog   先感谢众多朋友的支持 ...

  4. 四象限法推导lm曲线_【老王讲放射】四象限理论

    FCR的研发者之一高野正雄将CR系统影像处理的运行原理归纳为"四象限"理论,EDR(曝光数据识别器)的功能和CR系统工作原理可以用"四象限"理论进行描述. 1. ...

  5. Java设计模式之策略模式与状态模式

    一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...

  6. 换个姿势学设计模式:策略模式

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:公众号「闻人的技术博客」 前言 前段时间,接到一个 ...

  7. zemax中非序列添加相位面_老王讲放射MRI脉冲序列的基本参数

    今天这篇重点也是考师或中级的重中之重,里面比较多的字母代号,务必记好.有些人可能不知道,考试的时候这些重点可能会以什么样的方式出现? 那么我今天在每个重点后面都添加了问题,以供大家参考! 磁共振序列参 ...

  8. 设计模式:策略模式(Strategy)

    定   义:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化, 不会影响到使用算法的客户. 示例:商场收银系统,实现正常收费.满300返100.打8折.......等不同收费 ...

  9. C++设计模式之策略模式(Strategy)

    Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...

最新文章

  1. popen函数_PHP中16个高危函数
  2. bzoj1257 数学整理二分查询
  3. some understanding of《Improved Use of Continuous Attributes in C4.5》
  4. SAP Cloud for Customer里的HTML Mashup的JavaScript编程功能
  5. python基础-基础知识(包括:函数递归等知识)
  6. mysql被更新失败_更新mysql出错:出错原因 You are using safe update mode
  7. 日志服务(原SLS)新功能发布(4)-- 使用OSS进行日志存储与分析
  8. 【二叉树迭代版前序遍历】LeetCode 144. Binary Tree Preorder Traversal
  9. IPHONE手机知识大全(下)
  10. 单商户商城系统功能拆解09—微页面
  11. 小米10 MIUI11 安卓10安装面具获取root权限
  12. 荷池堪作镜,盈盈可鉴心。(递推
  13. - **体感试衣镜等功能代码工程分享**
  14. DWG文件怎么转成PDF格式?介绍两种方式
  15. 快速傅里叶和离散傅里叶的区别?
  16. linux 移动硬盘 machine,MacBook使用一块移动硬盘做Win To Go及Time Machine备份
  17. mui 框架 手机端不生效问题
  18. u盘插在电脑上灯亮没有反应_Win7系统插入U盘指示灯亮但电脑不显示的解决方法【图】...
  19. Java并发与多线程
  20. 麻省理工学院计算机系硕士课程,麻省理工学院计算机专业研究生申请 你听说过《算法导论吗》?...

热门文章

  1. HTML入门:html常用的标签
  2. 太真实了!有个程序员男友原来是这样的!
  3. fanuc机器人自动程序前怎么回原点_FANUC机器人的执行程序
  4. java mongocollection_MongoDb完结笔记-与java结合
  5. matlab 并行 计时,用Zen2跑MATLAB R2020a并行计算负载有点奇怪 - 桌面电脑(Computer)版 - 北大未名BBS...
  6. STM32F103单片机JTAG端口重映射
  7. Tmk吃汤饭(模拟)
  8. 【数据分析】你一定要掌握的Python七种数据清洗方法
  9. WARNING: A newer version of conda exists.
  10. 转:ReLU激活函数:简单之美