本章从浅入深的讲解了策略模式的使用,以及策略模式中所涉及到的几个设计原则,在本章的最后给出了策略模式的定义。

 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章 策略模式的更多相关文章

  1. JAVA设计模式——第 1 章 策略模式【Strategy Pattern】(转)

    刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手问题,嘿,还别说,真是解决了大问题,搞到最后是周瑜陪了夫人又折兵呀,那咱们先看看这个场景是什么样子的. 先说这个场景 ...

  2. 设计模式之第8章-策略模式(Java实现)

    设计模式之第8章-策略模式(Java实现) “年前大酬宾了啊,现在理发冲500送300,冲1000送500了.鱼哥赶紧充钱啊,理发这事基本一个月一回,挺实惠的啊.不过话说那个理发店的老板好傻啊,冲10 ...

  3. [head first 设计模式] 第一章 策略模式

    [head first 设计模式] 第一章 策略模式 让我们先从一个简单的鸭子模拟器开始讲起. 假设有个简单的鸭子模拟器,游戏中会出现各种鸭子,此系统的原始设计如下,设计了一个鸭子超类,并让各种鸭子继 ...

  4. 第 1 章 策略模式【Strategy Pattern】

    第 1 章 策略模式[Strategy Pattern] 以下内容出自: 24种设计模式介绍与6大设计原则.pdf 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个锦囊妙计,说是按天机拆开解决棘手 ...

  5. 第21章 策略模式(Strategy Pattern)

    原文 第21章 策略模式(Strategy Pattern) 策略模式 导读:策略模式看完之后,大多数人都会感觉有点混了,包括我,感觉策略模式是一种OO思想的体现(纯属个人拙见). 概述:       ...

  6. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  7. Java设计模式(18)策略模式(Strategy模式)

    Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...

  8. php设计模式课程---6、策略模式如何使用

    php设计模式课程---6.策略模式如何使用 一.总结 一句话总结:比如代码需求,做一饭店,有南北方不同菜系,不同分店有不同的饭菜汤的需求,代码怎么设计 从饭店有特色过渡到厨师有特色(南方厨师(南方饭 ...

  9. php设计模式-------(1)策略模式

    一.为什么我要学习设计模式. 我的上一个项目是做App接口,由于时间紧,老板催的急,所以到最后项目完工时发现居然写了几万行代码,可想而知代码质量有多糟糕.而且很多时候,调用接口的开发人员来找我说某个接 ...

随机推荐

  1. linux开机启动smb服务

    修改/etc/rc.local文件(增加红色部分) [root@localhost ~]# cat /etc/rc.local #!/bin/sh## This script will be exec ...

  2. 关于cookie与session的理解

    服务器端并不能捕获客户端的浏览器关闭事件,因此你关闭浏览器以后,服务器端那个Session还是存在的,要超时以后才被回收,启动一个新的浏览器会启动一个新的session,所以他不认你了session永 ...

  3. centos7 minimal版本下mysql的安装

    最近第一次尝在虚拟机上安装mysql,由于是centos7 minimal版本,很多安装包或命令必须自己添加,遇到很多问题. 首先是执行# yum install mysql-server 报错: 打 ...

  4. js动态增加秒数(自动,手动)

    //获取当前的日期及时间Date var myDate = new Date();      myDate.getYear();        //获取当前年份(2位)      myDate.get ...

  5. redis内存消耗详解

    Redis所有的数据都存在内存中,相对于廉价的硬盘,内存资源还是比较昂贵的,因此如何高效利用redis内存变得非常重要. 内存消耗分析 管理内存的原理和方法 内存优化技巧 一.内存消耗 理解redis ...

  6. JavaScript中闭包实现的私有属性的getter()和setter()方法

    注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  7. VBA编程的工程性规划

    看过很多人写的VBA代码,一团一团的,一点规划都没有,为了VBA编程更具工程性,这里讨论一下,并列出自己的一些建议:0.给VBA工程定义一个名字,而非直接使用默认的名称——"VBAProje ...

  8. CentOS 6.5 下安装 Redis 2.8.7(转载)

    wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make ...

  9. hdu 3926 hands in hands

    https://vjudge.net/problem/HDU-3926 题意:有n个小朋友,他们之间手拉手,但是一只手只能拉一只手或者不拉,现在给出两个图,表示拉手关系,问这两个图是否同构.思路:一开 ...

  10. “玲珑杯”ACM比赛 Round #12 (D) 【矩阵快速幂的时间优化】

    //首先,感谢Q巨 题目链接 定义状态向量b[6] b[0]:三面临红色的蓝色三角形个数 b[1]:两面临红色且一面临空的蓝色三角形个数 b[2]:一面临红色且两面临空的蓝色三角形个数 b[3]:三面 ...