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接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...
随机推荐
- System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization.dll 中发生
异常信息: “System.Runtime.Serialization.SerializationException”类型的未经处理的异常在 System.Runtime.Serialization. ...
- jquery水平导航菜单展示
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux 小技巧(磁盘空间搜索)
这里记录一些linux 管理中可能会用到的又容易忘的一些小技巧. linux磁盘写入失败,提示磁盘空间不足.一般都会用df -h 或者df -i看是不是磁盘空间不足或者是inode空间不足.发生这种情 ...
- 如何维持App拥护登录状态(仅仅理论)
这个问题太过于常见,也过于简单,以至于大部分开发者根本没有关注过这个问题,我根据和我沟通的开发者中,总结出来常用的方法有以下几种: 一:服务端默认的session 这种方式最大的优点是服务端不用增加任 ...
- Java程序设计---io流读取文件内容并将其逆值输出到控制台
import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileR ...
- IBM Security AppScan Standard 用外部设备录制脚本(手机端应用、app、微信等)进行安全测试
一.打开AppScan,选择外部设备/客户机,点击下一步 二.记录代理设置,可以手动输入需要的端口号,也可以自动选择,记住端口号以及PC电脑的ip地址,手机端如何设置对应的端口跟ip可以参考 Jmet ...
- [图形学] Chp8.4 OpenGL 二维观察函数——视口
这节有几个显示窗口的控制函数,可以调整视口,创建子窗口,最小化为图标,设置图标名称,隐藏显示等. gluOrtho2D (xwmin, xwmax, ywmin, ywmax); // 定义二维裁剪窗 ...
- MySQL常用基本命令
启动MySQL /etc/init.d/mysqld start 优雅的关闭数据库的方法 1:使用MySQLadmin mysqladmin -uroot -p123456 shutdown 2:使用 ...
- 在CI中实现持续Web安全扫描
一. 当前Web应用安全现状 随着中国互联网金融的爆发和繁荣,Web应用在其中扮演的地位也越来越重要,比如Web支付系统.Web P2P系统.Web货币系统等.对于这些金融系统来讲,安全的重要性是不言 ...
- VBA编程的工程性规划
看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称——"VBAProje ...