Head First 设计模式 第1章 策略模式
本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义。
1、定义及优点
什么是策略模式呢?
答:定义算法族(对象),分别封装起来,让他们之间可以相互替换。
优点:算法(对象)的变化独立于使用算法的客户
如果,没有看本章前面的东西,直接给我这么一个定义,我也不明白这说的是什么意思。然而,如果你读了前面的东西,在来看这个定义就很简单了。
通俗来说就是(我个人的理解),把相互独立的东西独立出来,单独定义成算法(也就是对象,java世界中万物皆对象),然后在另一对象要使用该算法的时候直接引用该算法,这样,当算法发生变化或者引用另一个算法时,不会影响到使用算法的客户(也就是刚才说的引用算法的对象)。
以上就是我自己理解的策略模式,这种模式在你理解之后,会发现,实际的工作或学习过程中,我们在很多地方会用到策略模式。比如,当你定义一个USER的时候,这个 USER中会有姓名、性别、联系方式、地址,而地址又是一个独立的对象,封装了省、市、县、街道、详细地址,你在USER中引用这个地址,即便地址修改了,也不会影响到使用 这个地址的USER,这应该就是最简单的策略模式了,相对复杂点的就是下面本书中说道的“鸭子问题”了。
2、鸭子问题
由于我本地并没有装visio,所以就用画图简单的画了一个“类UML图”(我们暂且这么称呼它吧)。
右下方的QuackBehavior是封装的呱呱叫行为,忘标注了。;-)

“类UML图”说明:
鸭子本身会有颜色,并且自身会游泳,所以游泳直接在基类中实现(因为所有鸭子都会游泳),而鸭子的颜色需要子类来实现(毕竟所有的鸭子并不是同一个颜色的);
然而有的鸭子在自觉不自觉的过程中学会了飞行(实际是滑翔),而有的鸭子依旧不会这项本领;还有的鸭子出生只会呱呱叫有的是吱吱叫还有得生病了不会叫。
1、这时候,在定义飞行跟叫的时候,考虑到不同的鸭子行为是不一样的,第一时间想到的是继承,然而如果继承字基类Duck,那么在子类中会出现大量的重复代码(有部 分鸭子是会飞的,有部分是不会飞的;大部分鸭子是呱呱叫),所以这时候要考虑把这些重复的代码抽取出来,独立封装,就得到了相对应的飞行/叫的行为。
2、如果,不同的行为定义为不同的类,会发现,在鸭子类中引用会很麻烦。这时候就考虑到了面向接口编程,只管接口,而不需要去考虑具体实现,这样,只需要在鸭子 中引入接口即可,在运行时将飞行行为动态绑定到鸭子上。
通过上面两步分析,我们终于比较完美的实现了这个过程,这就是策略模式。
3、涉及到的设计原则
A)、找出代码中需要变化之处,把他们独立出来,将其与不需要变化的代码相分离,以便日后可以轻易的改动和扩充;
<不同的鸭子,它的飞行和叫可能是不一样的,并且可能有的鸭子不会飞也不会叫,而有的鸭子即会飞也会叫>
B)、面向接口编程,而不是面向实现编程。
<说明:这里的接口,不是Java中实际意义的Interface,关键在于Java的多态。你可以面向接口、抽象类编程>
C)、更多的去使用组合代替继承。
<HAS-A 要优于 IS-A,因为HAS-A可以在运行时动态改变其行为而不影响调用该行为的对象。鸭子有一个飞行和叫的行为,而不是让所有的鸭子去继承自基类的行 为>
关于第1章的策略模式就介绍到这里,如果以上内容有出错的地方,还请不吝赐教,大家共同学习。
第2章的观察者模式会在最近几天更新....
转载请注明出处,谢谢!
Head First 设计模式 第1章 策略模式的更多相关文章
- JAVA设计模式——第 1 章 策略模式【Strategy Pattern】(转)
刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景 ...
- 设计模式之第8章-策略模式(Java实现)
设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...
- [head first 设计模式] 第一章 策略模式
[head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...
- 第 1 章 策略模式【Strategy Pattern】
第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...
- 第21章 策略模式(Strategy Pattern)
原文 第21章 策略模式(Strategy Pattern) 策略模式 导读:策略模式看完之后,大多数人都会感觉有点混了,包括我,感觉策略模式是一种OO思想的体现(纯属个人拙见). 概述: ...
- JavaScript设计模式与开发实践 - 策略模式
引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- php设计模式课程---6、策略模式如何使用
php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...
- php设计模式-------(1)策略模式
一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...
随机推荐
- Lamp单独安装(windows下)
安装的软件清单:apache_2.2.9-win32-x86-openssl-0.9.8h-r2.msimysql-5.1.28-rc-win32.zipphp-5.2.6-Win32.zipphpM ...
- Unity应用架构设计(12)——AOP思想的实践
想象一下,当程序所有的业务逻辑都完成的时候,你可能还来不及喘口气,紧张的测试即将来临.你的Boss告诉你,虽然程序没问题,但某些方法为什么执行这么慢,性能堪忧.领会了Boss的意图之后,漫长的排查问题 ...
- Python3组合数据类型(元组、列表、集合、字典)语法
一.序列类型(字符串,元组(),列表[]) 序列类型支持in,len(),分片[],迭代,5种内置序列类型:bytearray,bytes,list,str,tuple(元组). 1.元组可以嵌套(如 ...
- OJ2236“孤单数”题目报告
题目描述:有2n+1个数,其中有n对数字是成双出现的,有且仅有1个数字只有它自己一个.请你找出这个孤单数. 输入描述: 第一行有且只有一个正整数n(n<=500000) 第二行有2n+1个数ai ...
- Linux离线安装Ruby详解
很多时候我们会发现,真实的生成环境很多都没有外网,只有内网环境,这个时候我们又需要安装Ruby,则不能提供yum命令进行在线安装了,这个时候我们就需要下载安装包进行离线安装.本文主要简单介绍如果离线安 ...
- Newtonsoft.Json输出JSON 时动态忽略属性
一,前言 最近做项目采用Json形式和其他客户端交互,借助于Newtonsoft.Json . 由于业务场景不同,输出的Json内容也不同.要想忽略的属性,可以借助Newtonsoft.Json的特性 ...
- vue2.0设置proxyTable使用axios进行跨域请求
这里请求的是知乎日报的api,由@izzyleung这位大神提供的,这是github地址. 在vue-cli构建的项目中先安装axios npm install axios -S 这里暂不考虑用vue ...
- Spring MVC 文件下载时候 发现IE不支持
@RequestMapping("download") public ResponseEntity<byte[]> download(Long fileKey) thr ...
- Javsssist用InsertAt()方法对语句插桩
基于上一篇的方法插桩,这一篇则是进一步的对每行的语句进行插桩. 对于存在分支的方法(例如if(){}else{}),对方法插桩的方法是不能够全部涉及到的.所以要对程序的每条语句进行插桩. 插入什么语句 ...
- C#语法糖演进-C#语言和.NET Framework平台介绍
p { font-size: 14px; text-indent: 2em } .title { text-indent: 0; font-size: 22px; font-weight: bold; ...