首先申明,此处将大量引用chjavach之博客,因为他写得太好了,太精准了!而且此博客的目的也只是相当于读书笔记而已.只是对自己的理解和记忆有用罢了!
策略模式可谓最简单的模式,其类图只要瓢一眼,保准你十年忘不掉!然而要灵活多变,掌握其精髓,如果没有深刻的认识,是难以做到的!
为了理解而理解
模式只是类结构,或者基于类的算法,不是基于数据结构的算法
chjavach 写道
(1)策略模式的功能
策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。
与if-else相似,并且可以替代.重构之一就是if-else了,但是一个过程式思维和一个面向对象思维,之间的转换,是挑战哈
chjavach 写道
2)策略模式和if-else语句
看了前面的示例,很多朋友会发现,每个策略算法具体实现的功能,就是原来在if-else结构中的具体实现。
没错,其实多个if-elseif语句表达的就是一个平等的功能结构,你要么执行if,要不你就执行else,或者是elseif,这个时候,if块里面的实现和else块里面的实现从运行地位上来讲就是平等的。
而策略模式就是把各个平等的具体实现封装到单独的策略实现类了,然后通过上下文来与具体的策略类进行交互。
因此多个if-else语句可以考虑使用策略模式。
如图,策略A与策略B或者C,之间的关系,用下面的话来解释,真的是太精准了
chjavach写道
3)算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正是因为这个平等性,才能实现算法之间可以相互替换。
所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。
转换角色,转换思考角度去观察模式,以策略模式的客户去认识策略模式,在类图的表现上,实际就是context的设计,或者如何使用策略的文档
chjavach 写道
(4)谁来选择具体的策略算法
在策略模式中,可以在两个地方来进行具体策略的选择。
一个是在客户端,在使用上下文的时候,由客户端来选择具体的策略算法,然后把这个策略算法设置给上下文。前面的示例就是这种情况。
还有一个是客户端不管,由上下文来选择具体的策略算法,这个在后面讲容错恢复的时候给大家演示一下。
具体的策略分析了,客户分析了,那怎么架起这座桥梁呢?那当然是接口和抽象类了!
chjavach 写道
在前面的示例中,Strategy都是使用的接口来定义的,这也是常见的实现方式。但是如果多个算法具有公共功能的话,可以把Strategy实现成为抽象类,然后把多个算法的公共功能实现到Strategy里面。
关注了静态结构,那么运行时刻的特点,是下面这样的
chjavach 写道
(6)运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态的在不同的策略实现中切换,但是同时只能使用一个。
再从对修改封闭,对扩展开放,这个软件原则来分析下
chjavach 写道
7)增加新的策略
在前面的示例里面,体会到了策略模式中切换算法的方便,但是增加一个新的算法会怎样呢?比如现在要实现如下的功能:对于公司的“战略合作客户”,统一8折。
其实很简单,策略模式可以让你很灵活的扩展新的算法。具体的做法是:先写一个策略算法类来实现新的要求,然后在客户端使用的时候指定使用新的策略算法类就可以了。
其实在chjavach博客中,涵盖了所有这一起的,我现在只不过想来个看图连线!
为了实践的模式
chjavach 博客中有两个事例,非常好理解,也具有非常好的参考价值,一是报价系统,对于报价这个多种策略行文的封装,二是对于容错处理,这个非常新鲜,主要是我经验太少的缘故,所以见笑了!
但是我觉得,对于自己这个学习者是,远远不够的!
之前也看过很多设计模式的书,当然只是纸上谈兵.但是在实践中,我却甚是苦恼.对于很多,我认为可以使用设计模式的地方却是无所适从,眼高手低!
曾特别的关注重构趋于模式,所以那时候也强烈的感受到,模式的使用,是慢慢的重构出来的!
博客写至此,突然想到,是不是背后的思维方式在作怪呢?
如果脑子力就是过程式,那么用设计模式就是不可能的!而重构,可以让我从过程慢慢的转变到面向对象思维中,慢慢的清晰与可理解!
那么为什么不以开始就以面向对象的思维方式呢?是不是平时整日浸淫在过程或者别的思维方式之中,对于面向对象的转换并不是那么的容易呢?
之前也一度想过,可能是对于背后的设计原则并没有深刻的理解吧?单职责原则,对于职责的划分,在实践和工作中,怎么慢慢的分析与得到呢?其实工作中,哪里还会这么的细细的想啊?或者以功能为导向的工作,扼杀了设计原则,设计模式的应用!
总结下
理解策略模式并不难,只要稍要基础的人,都可以做到!
然而要应用它,最难的还是克服习惯性的过程式思维,以面向对象的角度思考,并且以设计原则为根本去分析问题,设计解决方案
当然,多欣赏优秀代码,并且触类旁通,然后深刻对比与反思,也是可以达到应用好设计模式的!
分享到:
相关推荐
在IT项目开发中,经历一个项目从开始到完成往往能带来深刻的感悟。在这个"信息发布系统项目"中,我们可以总结出一些关键的知识点和实践经验。 首先,需求分析是项目的基础,确保需求的准确性至关重要。...
7. **与其它模式的关系**:工厂模式常与策略模式、建造者模式等结合使用,以实现更复杂的对象创建逻辑。 通过学习和理解工厂模式,开发者可以更好地设计和组织代码,提高代码的可复用性和可维护性,这对于大型项目...
相比之下,小王子的形象则显得更为成熟和深刻。他不仅拥有爱心,而且懂得如何去传递快乐,让周围的人都感受到温暖。小王子的智慧在于他的谦逊和开放,他愿意倾听,愿意理解,因此他能带给他人真实的快乐。他的存在...
BATHE模式是一种在全科医疗实践中广泛应用的问诊记录方式,旨在通过系统化的步骤来捕捉病人的生物、心理和社会层面的问题。该模式由Stuart和Lieberman在1986年提出,作为SOAP(Subjective, Objective, Assessment, ...
文档标题和描述并未直接涉及IT行业的专业知识,而是关于本科教学合格评估的一个感想,主要讨论的是高等教育质量管理和改进的过程。不过,我们可以从中提取出一些与教育管理相关的知识点,并将其与IT行业的一些实践相...
GCT数学复习之感想GCT数学复习之感想GCT数学复习之感想GCT数学复习之感想GCT数学复习之感想
### 设备管理思维与模式创新的关键知识点 #### 一、主角与配角的辩证观 在企业运营过程中,设备管理通常被看作是辅助性的角色,但从系统的角度来看,设备管理实际上发挥着至关重要的作用。设备管理与其他部门如...
- **《小布头奇遇记》**:中国儿童文学经典之一,通过一系列冒险故事传递正能量。 - **《小兵张嘎》**:描述了一位勇敢机智的小战士张嘎的故事。 - **《小英雄雨来》**:以抗日战争为背景,讲述了一个勇敢少年的成长...
“安卓应用-电子图书-哲思读书最新版 v0.0.1”是一个专为Android平台设计的电子图书阅读应用,旨在为用户提供丰富的哲学类书籍资源,帮助用户在闲暇之余深入思考人生与世界。该应用的版本号为v0.0.1,这通常表示它...
eating.cpp : Defines the class behaviors for the application eating.cpp : Defines the class behaviors for the application
同时,它还具备夜间模式和自定义字体大小的功能,照顾到不同用户在不同环境下的阅读习惯和视力需求,确保舒适的阅读体验。 此外,该应用可能还包含笔记与书摘功能,用户可以在阅读过程中随时记录感想,保存重要信息...
新课程改革心得体会感想-资料___.docx
新华书店图书仓库管理员感想-与梦想一起飞 .doc
在对“空乘人员感想-论文.zip”这个压缩包中的内容进行分析时,我们可以预想到这应该是一份关于空乘人员工作体验、心理状态、职业挑战或行业发展趋势的研究论文。由于具体的内容我们无法直接查看,只能根据标题和...
2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 monoglyph 30 2.4.3 decorator 模式 32 2.5 支持多种视感标准 32 2.5.1 对象创建的抽象 32 2.5.2 工厂类和产品类 33 2.5.3 abstract ...
操作系统是计算机科学的基础课程之一,它管理着计算机的硬件资源,为用户提供服务并协调软件运行。在这个“操作系统课程设计-论文,感想,程序”的压缩包中,包含了学习和实践操作系统设计的重要元素。以下是根据...
2022年因疫情原因就地过年感想-疫情期间过年的感受.docx
此外,学院领导的重视和具体指导,以及教职工的积极参与,对于提高教学质量至关重要,这与IT企业内部的培训计划和团队建设有共通之处。 在教学投入方面,无论是硬件设施(如实验室、设备)还是软件设施(如课程设计...
孙子兵法读书感想.pdf