`

设计模式1-策略模式全面解析+案例实践+总结

阅读更多
设计模式1-策略模式全面解析+案例实践+总结CSDN地址:https://blog.csdn.net/chentian114/article/details/81879911

本文是对面向对象设计模式--策略模式的一个解析,主要分为定义解析、以案例-鸭子游戏对策略模式解析、多案例练习加深对策略模式的理解、最后总结整理知识要点与策略模式的一些优缺点或适用场景。
第一篇:定义解析
策略模式是GoF四人帮整理的《设计模式-可复用面向对象软件基础》一书中23种设计模式中归类为行为型模式中的一种,23种设计模式根据它们的用途分为三大类:5种创建型模式、7种结构型模式、11种行为型模式。
引自GoF四人帮对策略模式的定义与类图:
Strategy(策略模式):定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。



1)一系列算法或者也可以说是一个算法族,代表这些算法具有同一种特性。
如策略模式类图中具体算法实现ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC都属于同一个接口Strategy的具体实现。
算法可以理解为能够解决某个问题或完成某个功能的方法,例如实现不同叫声行为的方法。
2)把它们一个个封装起来,蕴含着面向对象设计原则--封装变化。
OO设计原则:找出应用中可能需要变化之处,把它们独立起来,不要和那些不需要变化的代码混在一起。
通过封装变化原则,当应用需要变化的时候,只需要修改已经封装起来会变化的部分,而不会影响到应用的其它部分。提高了应用的弹性与可维护性。
策略模式中的一系列算法,就是应用中会变化的部分被一个个封装起来。如策略模式类图中具体算法实现ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC,如果需要对某一个算法如ConcreteStrategyA进行改正,只需要对其一个实现类进行修改即可,不会对其它类产生影响;或者需要添加新的算法实现,只需要新增一个实现即可不会对旧的代码产生影响。
3)使它们可相互替换,蕴含着面向对象设计原则--针对接口编程。
OO设计原则:针对接口编程,而不是针对实现编程。
针对接口编程的真正意思是针对超类型编程。更具体的说变量的声明类型应该是超类型,通常是一个抽象类型或一个接口,如此只要是具体实现此超类型的实现类所产生的对象都可以指定给这个变量;也意味着,声明类时不用理会执行时真正的对象类型。
如策略模式类图中,Context声明类型为超类型Strategy,Context不需要理会执行时具体的对象类型是哪一个;同时,运行时也可以对具体的对象类型进行修改。

第二篇:以案例-鸭子游戏对策略模式解析
引自《Head First 设计模式》-- 进入设计模式的世界。
1)原始需求:现有一款游戏,游戏中出现各种鸭子,一边游泳,一边呱呱叫。原始设计:采用面向对象技术,设计一个鸭子(Duck)超类,并让各种鸭子继承此超类。如下图所示:
2)需求变更1:现在我们得让鸭子能够飞。这是公司管理层为了更高的市场份额制定的方案(作为程序员的你不得不对游戏进行升级)。
我们继续使用继承的方式实现此需求,在超类中添加飞行方法(fly),如下图所示:

通过在超类中添加方法,所有的子类都会继承它,改动非常小,确能够实现在所有子类中复用。
3)问题发生了?在一次产品演示会上,有一只橡皮鸭在屏幕上飞来飞去......
橡皮鸭是模型鸭子并不能够飞行,但超类中实现了飞行方法,使得橡皮鸭这个子类同样也具备了飞行的方法,如下图所示:

为了解决这个问题,我们不得不在子类橡皮鸭中重写飞行方法(fly)以覆盖超类中的飞行方法,但是如果又有新的鸭子子类也不能飞行,那不得不对每个不能飞行的鸭子子类进行重写。
总结:使用继承带来的缺点,1.代码在多个子类中复用,2.运行时的行为不易改变(在编译期就已经确定好),3.难以得到子类鸭子的全部行为,4.超类改变牵一发动全身。
4)试着使用接口的方式解决?把飞行行为、叫声行为抽象成接口,能够飞的子类鸭子实现飞行接口,不能够飞行的就不实现飞行接口。如下图所示:
采用接口的方式,使用继承因超类改变而使得所有子类都会受影响的问题得到解决,但又产生了新的问题,每一个子类都不得不编写飞行方法,当子类数量变得很大时, 将会造成大量的重复代码;而且当需要对飞行方法进行很小的修改时,不得不对每一个子类的飞行方法进行修改,这将是另一场灾难。
5)OO原则:封装变化。把鸭子游戏中会变化的部分抽取出来,如鸭子的飞行行为与叫声行为,如下图所示:

这样鸭子类就不需要知道飞行行为、叫声行为的具体实现细节了。
OO原则--封装变化:把会变化的部分抽取出并封装起来,以便以后可以轻易的扩展此部分,而不影响其它部分。这样系统变得更有弹性。
6)OO原则:针对接口编程。利用接口代表每个行为,每个行为有自己不同的实现类。如下图所示:


这样设计后,鸭子类不再负责实现飞行方法fly()和叫声方法quack(),而是由行为类专门负责实现。使得飞行行为、叫声行为不再会绑死在鸭子类中,同时这些行为类也能非常方便的复用到其它地方。
7)OO原则:多用组合,少用继承。现在我们整合鸭子类,将飞行和呱呱叫行为,委托给具体的行为类处理,如下图所示:



使用组合建立的系统具有很大的弹性,且可以运行时改变行为。鸭子游戏重构后如下图所示:




鸭子游戏中的飞行行为、呱呱叫行为其实就是使用的策略模式。如呱呱叫、吱吱叫等就是一系列算法,它们共有的特性都是叫声行为,不同的叫声行为之间可相互替换,它们的变化独立于使用它们的客户鸭子类。

第三篇 案例练习,案例引自网络。
案例源码查看:https://github.com/chentian114/100-dayaction/tree/master/designpattern-1

案例1:流量冲值案例,根据客户选择不同的产品,选择相应的冲值渠道进行流量冲值,流量冲值渠道有(麻袋氪、融漫、极信)。

具体实现参考链接 FlowRecharge

案例2:出行方式案例,根据不同天气选择不同的出行方式:晴天选择骑行、阴天选择步行、雨天选择开小车。
具体实现参考链接 GoWay

案例3:士兵射击游戏,士兵可以选择不同的方式进行射击。
具体实现参考链接 SoldierGame

案例4:诸葛亮的三个锦囊妙计,刘备到江东娶孙尚香,三个计策分别在三种不同情况下使用:刚到江东,使用找乔国老开后门计策;结婚后,使用找吴国太开绿灯计策;逃离江东情况下,使用找孙夫人断后计策。


具体实现参考链接 Stratagem

案例5:策略枚举案例,实现输入两个数字与加减操作符获得计算结果。
具体实现参考链接 CalculatorDemo


第四篇 总结
三条面向对象设计原则:1、封装变化 2、针对接口编程,而不是实现编程3、多用组全,少用继承。
策略模式:定义一个算法族,一个个封装起来,使它们可相互替换。使用算法的变化独立于使用它的客户。

优点:
算法可以自由切换,扩展性良好。

缺点:
策略类数量增多,所有策略类都需要暴露给客户,增加客户的难度。

适用场景:
1、当需要频繁的增加else if或case时,可以考虑使用策略模式减少它们之间的耦合度。
2、多个类只有在算法或行为上稍有不同的场景。
3、算法需要自由切换的场景。
4、需要屏蔽算法规则的场景。
  • 大小: 15 KB
  • 大小: 14.5 KB
  • 大小: 21.5 KB
  • 大小: 30.4 KB
  • 大小: 36.5 KB
  • 大小: 26.2 KB
  • 大小: 12 KB
  • 大小: 42.5 KB
  • 大小: 92.9 KB
  • 大小: 13.6 KB
  • 大小: 9.7 KB
  • 大小: 8.5 KB
分享到:
评论

相关推荐

    高清-软件设计师书籍2-5版+笔记资料+历年真题解析

    《高清-软件设计师书籍2-5版+笔记资料+历年真题解析》是一个全面的资源包,涵盖了软件设计师考试的相关学习材料。这个压缩文件包含了从第2版到第5版的软件设计师书籍,以及配套的笔记和历年真题解析,为备考者提供了...

    SpringMVC精品资源--Spring+SpringMVC+Mybatis+easyUI实现简单的后台管理系统.zip

    它遵循 MVC 设计模式,将模型、视图和控制器分离,使得代码结构更加清晰。开发者可以定义处理器映射器和视图解析器,以处理 HTTP 请求并返回相应的视图。Spring MVC 还支持多种视图技术,如 JSP、Thymeleaf 等。 **...

    蚁群算法-旅行商问题-人工智能-java-代码+报告+注释.docx

    ### 蚁群算法在旅行商问题中的应用 #### 一、整体结构与功能...综上所述,本项目通过Java语言实现了蚁群算法解决旅行商问题的过程,通过详细的类设计、参数设置和结果展示,为理解和应用蚁群算法提供了全面的参考。

    《设计模式--基于C#的工程化实现及扩展》.(王翔).rar

    总之,《设计模式--基于C#的工程化实现及扩展》是一本全面讲解C#设计模式的书籍,它结合具体实例,帮助开发者掌握并灵活运用设计模式,提升软件开发的效率和质量。通过学习书中的内容,读者不仅可以理解设计模式的...

    Android 源码设计模式解析与实战 完整版带书签目录

    这本书全面解析了Android系统中的设计模式,并结合实际案例,为开发者提供了丰富的实战经验。书中涵盖的设计模式是软件工程中重要的设计原则和实践,对于提升Android开发者的技能和代码质量具有重大意义。 设计模式...

    设计模式解析_第2版_高清完整目录_人民邮电出版社____含源代码_Java_C++

    总之,《设计模式解析_第2版》是一本全面、深入且实用的设计模式指南,无论是初学者还是经验丰富的开发者,都能从中受益。配合完整的源代码,读者可以更直观地学习和实践,从而提高软件设计的效率和质量。对于想要...

    设计模式解析.pdf

    设计模式是软件工程中经过长期实践总结出来的一种解决常见问题的最佳实践,对于提升代码质量、可维护性和可扩展性具有重要作用。在Java开发中,理解和掌握设计模式是成为一名优秀程序员的必经之路。 该书首先会介绍...

    软件设计师-复习笔记、重点突破、案例分析(中级)

    重点突破部分是对考试中可能出现的难点和易错点的集中解析,例如软件设计模式的理解与应用、面向对象设计原则、系统设计与优化策略等。这部分内容有助于考生在短时间内掌握关键知识点,提高答题的准确性。 三、案例...

    java设计模式(第二版)+源码

    本书《java设计模式(第二版)》是针对Java开发者深入学习设计模式的专业读物,包含了丰富的实践案例和源码分析,有助于读者从理论到实践全面掌握设计模式。 设计模式分为三大类:创建型模式、结构型模式和行为型...

    Design Patterns Explained(设计模式解析英文版)

    《设计模式解析》是一本深入浅出介绍设计模式的书籍,作者结合自身丰富的实践经验和教学经历,为读者提供了一个全面理解设计模式及其应用的方法论。该书荣获1999年第10届效能大奖,全书共357页,采用简明易懂的英文...

    design-pattern(设计模式,包括创建型、结构型、行为型三大类共23种常见的设计模式和J2EE常见设计模式等).zip

    通过"open_wei——damoxing"这个文件,可能包含的是具体的代码示例、案例研究或者教学材料,帮助用户深入理解并实践这些设计模式和人工智能大模型的应用。学习和掌握这些知识,对于提升个人或团队的软件开发能力和AI...

    侯捷 侯俊杰 设计模式 同济大学 课件

    1. **设计模式分类**:包括创建型模式(如单例、工厂方法、抽象工厂、建造者、原型模式)、结构型模式(如适配器、装饰器、代理、桥接、组合、外观、享元模式)和行为型模式(如模板方法、策略、命令、迭代器、访问...

    GoF 23种设计模式解析附C++实现源码(2nd Edition).pdf

    本书旨在全面解析GoF(Gang of Four)所提出的23种设计模式,并附带详细的C++实现示例代码。设计模式是面向对象编程中解决常见问题的有效策略,它们为软件开发人员提供了一套标准化的方法来处理复杂的设计挑战。 ##...

    java与模式-清晰书签版

    再者,《深入浅出设计模式(中文版)--案例好.pdf》可能是一个深度解读设计模式的书籍节选,它通过丰富的案例分析,让读者能够深入理解设计模式在实际项目中的应用。书中可能详细阐述了如何在Java项目中选择和应用合适...

    Java中23种设计模式-源码示例.rar

    本资源“Java中23种设计模式-源码示例.rar”提供了全面的Java设计模式实践案例,旨在帮助开发者更好地理解和应用这些模式。 首先,让我们逐一探讨这23种设计模式: 1. **单例模式**:保证一个类只有一个实例,并...

    图解java多线程设计模式-结城浩-完整高清带书签版本

    这本书以清晰易懂的方式,结合丰富的图表和实例,全面解析了Java多线程开发中的关键概念、设计模式以及实践技巧。在Java编程领域,多线程是不可或缺的一部分,它能提升程序的执行效率,实现并发操作,但同时也带来了...

    设计模式核心笔录

    总的来说,《设计模式核心笔录》是一份全面介绍和分析设计模式的重要参考资料,它将帮助开发者系统性地理解和掌握设计模式,提升软件开发的专业水平。通过实际案例和源码分析,使得理论知识与实践紧密结合,让开发者...

    Java设计模式(第2版)

    该书全面介绍了23种经典的设计模式,并结合Java语言特性进行了详细的案例分析与实践指导。 #### 二、设计模式的重要性 设计模式是软件工程中解决特定问题的有效方案集合。掌握设计模式有助于提高代码质量、增强系统...

Global site tag (gtag.js) - Google Analytics