夏天来了,深圳的大小梅沙必将是人满为患,大家在游泳时还是要注意安全地。那如果真人有溺水了怎么办?有人会打120,有人会做人工呼吸(必须得是个美女才行),有人会用拳头叩击心前区急救。他们的做法都是对的,只是不同情况,不同的人会有不同的策略!既然这样,那就用策略模式来模拟下,类图如下:
由图可以看出,策略模式非常简单,直接上代码:
<?php interface IStrategy{ public function operator(); } class Call120 implements IStrategy{ public function operator(){ echo "拨打120!\n"; } } class Breath implements IStrategy{ public function operator(){ echo "做人工呼吸!\n"; } } class Rap implements IStrategy{ public function operator(){ echo "用拳头叩击心前区!\n"; } } class Rescue{ private $strategy; public function __construct($strategy){ $this->strategy = $strategy; } public function operator(){ $this->strategy->operator(); } } echo "有人落水了!\n"; $rescue = new Rescue(new Call120()); $rescue->operator(); $rescue = new Rescue(new Breath()); $rescue->operator(); $rescue = new Rescue(new Rap()); $rescue->operator(); ?> 运行结果: 有人落水了! 拨打120! 做人工呼吸! 用拳头叩击心前区! [Finished in 0.1s]
策略模式的定义
也叫政策模式,定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式使用的就是面向对象的继承和多态机制,由三个角色构成
1、Rescue封装角色
也叫上下文角色,起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问、封装可能存在的变化。
2、Strategy抽象策略角色
策略、算法家族的抽象,通过为接口,定义每个策略或算法必须具有的方法和属性。
3、ConcreteStrategy具体策略角色
实现抽象策略中的操作,该类含有具体的算法。
策略模式的优点
1、算法可以自由切换
这是策略模式本身定义的,只要实现抽象策略,它就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略。
2、避免使用多重条件判断
多重条件语句不易维护,而且出错的概率大大增加。
3、扩展性良好
在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件,这大大地符合了OCP原则。
策略模式的缺点
1、策略类数量增多
每一个策略都是一个类,重用的可能性很小,类数量很多。
2、所有的策略类都需要对外暴露
上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违背的。不过可以使用其他模式来修正这个缺陷,如工厂模式、代理模式事享元模式。
策略模式的使用场景
1、多个类只有在算法或行为上稍有不同的场景
2、算法需要自由切换的场景
3、需要屏蔽算法规则的场景
策略模式的扩展
在JAVA中,利用其本身的枚举类型可以将策略模式扩展为策略枚举模式,目前PHP尚不支持。
如果系统中的一个策略家族的具体策略数量超过4个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题,否则日后的系统维护就会成为一个烫手山芊,谁都不想接。
相关推荐
1. 在历史故事中,诸葛亮被誉为足智多谋的代表,他的事迹如火烧赤壁、草船借箭等展现了他卓越的军事策略和智谋。他的智谋不仅体现在战争中,还体现在治国理政上,如安居乐业的“隆中对”策略。 2. 在人际交往中,...
7. 策略与智慧:《足智多谋的策士智慧》这本书旨在将古代的智慧应用于现代社会,通过对《六韬》和《三略》的解读,为现代人提供处世和管理的指导。 总结来说,这些知识点强调了中国古代智者对领导力、人际关系、...
2--[足智多谋的法师].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[足智多谋的法师].zip源码scratch2.0 3.0编程项目源文件源码案例素材源代码2--[足智多谋的法师].zip源码scratch2.0 3.0编程项目...
scratch2源码足智多谋的法师本资源系百度网盘分享地址
《足智多谋的法师-少儿编程Scratch项目源代码文件案例素材》是一个专为儿童设计的编程学习资源,旨在通过趣味游戏的方式引导孩子们接触和理解编程基础。在这个项目中,孩子们将扮演“足智多谋的法师”,利用Scratch...
本压缩包“scratch编程项目源代码文件案例素材-[足智多谋的法师].zip”包含了一个基于Scratch的完整游戏项目,名为“足智多谋的法师”,它是一个很好的少儿趣味编程示例,适合初学者学习和探索。 在"足智多谋的法师...
"足智多谋:Kotlin的Android资源绑定"这个主题聚焦于如何高效地利用Kotlin与Android资源进行交互,提升开发效率和代码可读性。下面将详细探讨相关知识点。 1. **Android资源** Android应用中的资源包括字符串、...
用于 hapi 框架的足智多谋的猫鼬对象 轻松为您的猫鼬模型创建处理程序 自动为您的处理程序生成路由 充分利用 api 响应的引用 安装 新产品经理 $ npm install hapi-mongoose-handler 克隆到项目中 $ cd /path/to/...
3. **教学重点**:理解两次赛马时,田忌的马出场顺序变化如何导致比赛结果的逆转,从而展示孙膑的足智多谋。 4. **教学难点**:分析田忌如何在孙膑的建议下,通过调整马匹出场顺序,实现从失败到胜利的转变,让学生...
这里体现了孙膑的足智多谋,也揭示了观察、分析问题和科学思维的重要性。 教学难点在于解释为什么仅调换马的出场顺序就能改变比赛结果。这是因为赛马比赛的胜负取决于马匹的相对实力和出场顺序的策略。在第二次比赛...
例如,孙膑胸有成竹地说“一定能让您赢”,展现了他对于策略的信心和足智多谋的性格特点。 2. **关联词语的使用**:学生要学会根据上下文语境选择合适的关联词填空,例如“而且”、“因此”、“无论”、“虽然”、...
2. **人物性格与智慧**:孙膑作为著名军事家,展现出深思熟虑、足智多谋的特点,他的策略改变了比赛结果,展示了智慧的力量。同时,田忌的谦虚接受建议也值得学习。 3. **教学目标**:使学生理解故事背后的道理,...
##弹涂鱼这是 Hapi 的一个资源丰富的路由插件。 给定一个描述可用资源的对象,将为资源上定义的每个方法创建一个路由。 例如: var Hapi = require ( 'hapi' ) ;var resources = { users : { index : function ( ...
这一部分要求学生理解西门豹的策略,并评价他的性格特点,如足智多谋、讲究策略、相信科学,同时摒弃迷信。 综合来看,这份课时练习旨在帮助学生深入理解《西门豹治邺》这篇课文,提高他们的语言运用能力,培养批判...
- 孙膑:足智多谋,善于观察,能提出创新策略。 - 田忌:信任朋友,敢于尝试,具有冒险精神。 - 齐威王:虽然在比赛中落败,但体现出王者的风范,知人善任。 6. **故事情节**: - 孙膑建议田忌改变赛马顺序,...
- **晏子**在这篇文章中被塑造为一个深思熟虑、足智多谋的政治家。他敏锐地洞察了孔子与鲁国之间的关系,并提出了巧妙的策略来应对孔子可能带来的威胁,显示了他的政治智慧和外交手腕。 4. **历史背景**: - 孔子...
4. **阅读理解**:短文《空城计》展示了历史故事中的智谋策略,要求学生理解故事内容,找出成语含义,分析人物行为,如"以卵击石"、"危在旦夕"、"足智多谋"等,同时对诸葛亮摆出空城计成功的原因进行分析。...
17. **思维敏捷性**:“足智多谋,随机应变”体现了思维的灵活性和敏捷性。 18. **问题解决策略**:尝试策略是指通过尝试所有可能的解决方案来解决问题。 19. **遗传与成熟**:格塞尔的实验表明,遗传因素决定了...
它的意思是提出的计谋或策略没有失算的地方,形容一个人足智多谋,策划周密,决策无误。 在实际应用中,"举无遗算"常用来赞誉那些具有深思熟虑、智谋高超的人。例如,在历史故事中,某位人物被形容为“运筹帷幄、举...
4. 人物性格分析:孙膑被描绘为足智多谋、自信且有卓越军事才能的人,而庞涓则被刻画为嫉妒心强、傲慢的人物,两人的性格对比突显了孙膑的智谋。 5. 司马迁和《史记》:介绍了司马迁及其著作《史记》的重要地位,...