HeadFirst设计模式<1>

1 策略模式

鸭子飞行和嘎嘎叫策略

2 工厂模式

简单工厂

工厂方法

抽象工厂

简单工厂简单的pizza工厂

  • 通过一个工厂类的方法,创建和返回对象实例

  • 原来混乱的代码:

  • 修改后

  • 简单工厂类图

Pizza店变成加盟店

  • 在创建Pizza时将工厂传进去

  • 想要多一些的质量控制,每个pizza店的工艺又不一样,有的先切再烤,有的先烤再切。

  • 现在来看看Pizza店的多态。将变化的东西移到低层(实现,子类),抽象的共性移到高层(超类或接口)这边把Pizza的工艺流程移到子类中去

  • PizzaStore超类变成,将CreatePizza变成抽象方法,由子类实现方法。

  • 工厂模式的工厂方法

Pizza本身,超类

  • Pizza的多态

最终的User调用

对于pizza店和pizza通过工厂模式形成了一个pizza组件,这边对pizza的实现,就不会违反针对接口编程

简单工厂模式

  • 创建者和产品

所有的底层都依赖于高层,高层与高层之间相互依赖,相互解耦。

  • 工厂UML

Pizza店再次升级,Pizza原料升级

  • Ingredient(成分)超类:

  • Dough(面团)Veggies(蔬菜)Pepperoni(意大利香肠)clam(蛤)子类:

改造Pizza类

  • 抽象方法prepare()

  • cheesepizza

  • 靠近一点工厂

  • 商店如何使用工厂

抽象工厂模式类图

抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

Pizza店的类图

3 命令模式

命令封装,支持撤销,宏命令,队列请求。

餐厅案例

餐馆点餐就是命令模式

回到遥控器

动作请求者和动作执行者解耦,

  • 命令接口:

  • 具体命令:

  • 命令调用者

  • 简单测试

命令的调用者是遥控器 ,命令执行者是灯,如果不用命令模式应该是遥控器直接调用灯。

命令模式最重要变化的是命令的执行者,在执行者有多种多样的时候,就需要命令模式来实现。

命令模式类图

receiver:就是上文中的灯,action方法为light.on()方法。

支持撤销

将每个命令支持撤销方法

使用状态的撤销

宏命令之激进的遥控器

该遥控器要实现自动化功能,一键打开灯光,音响,电视和DVD,直接进入Party模式

队列请求

命令可以在不同的线程中被调用,日程安排,线程池,工作队列等。

日志请求

​ 某些应用需要我们将所有的动作都记录在日志中,并能在系统司机之后,重新调用这些动作恢复到之前的状态,通过新增两个方法(store()和load()),例用对象的序列化(serialization)实现这些方法,序列化最好只用在对象持久化(persistence)上。

​ 怎么做:当我们执行命令的时候,将历史记录储存在磁盘中,一旦系统司机,我们就可以将命令对象重新加载,并成批地依次调用这些对的execute()方法。

​ 许多调用大型数据结构的动作的应用我无法在每次改变发生时被快速的记录。通过使用记录日志,可以将上次检查点(checkpoint)之后的所有操作记录下来。如果系统出状况,从检查点开始应用这些操作。

​ 比方说对于电子表格的应用:将电子表格的操作记录在日志中,而不是每次电子表格一有变化就记录整个电子表格。对于更高级的应用而言,这些技巧可以被扩展应用到事务(Transaction)中,也就是说一群操作必须全部进行完成。

4 状态模式

策略模式和状态模式是双胞胎,在出生时才分开。

策略模式是通过互换算法来创建成功业务的,状态是通过改变对象内部的状态来帮助对象控制自己的行为。

糖果机

这个一个状态图,每个圆圈都是一个状态。

测试:

激进糖果机

当曲柄转动时,有10%的几率会得到免费糖果。

将之前的状态都变成类创建state接口

  • 类似的实现所有的状态类
  • 糖果机改造

状态模式

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

状态模式和策略模式,状态模式是上下文根本不知道对象发生了改变

十次抽奖

总结

跟策略模式很像,策略模式是将不同的算法(变化的地方)封装成类,实现弹性变化,而状态模式是将不同的状态封装成类,同时客户不会直接改变状态,最好由状态自己改变状态,

HeadFirst设计模式<1>的更多相关文章

  1. 【Head-First设计模式】C#版-学习笔记-开篇及文章目录

    原文地址:[Head-First设计模式]C#版-学习笔记-开篇及文章目录 最近一年断断续续的在看技术书,但是回想看的内容,就忘了书上讲的是什么东西了,为了记住那些看过的东西,最好的办法就是敲代码验证 ...

  2. 《HeadFirst设计模式》读后感——对学习设计模式的一些想法

    最近看完了<HeadFirst设计模式>,GOF的<设计模式——可复用面向对象软件的基础>的创建型模式也读完了,经历了从一无所知到茅塞顿开再到充满迷惑的过程. 不得不说< ...

  3. Headfirst设计模式的C++实现——策略模式(Strategy)

    前言 最近在学习<Headfirst设计模式>,里面的例子都是Java的.但是我对Java并不熟悉,所以试着用C++来实现书中的例子. 先来看看Duck以及子类 Duck.h #inclu ...

  4. HeadFirst设计模式读书笔记--目录

    HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern) HeadFirst设计模式读书笔记(2)-观察者模式(Observer Pattern) HeadFirst设计 ...

  5. headfirst设计模式(2)—观察者模式

    定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...

  6. headfirst设计模式(5)—工厂模式体系分析及抽象工厂模式

    先编一个这么久不写的理由 上周我终于鼓起勇气翻开了headfirst设计模式这本书,看看自己下一个设计模式要写个啥,然后,我终于知道我为啥这么久都没写设计模式了,headfirst的这个抽象工厂模式, ...

  7. headfirst设计模式swift版01

    headfirst设计模式这本书真好,准备用一个月学完.书里讲得很清楚了. 设计原则: 1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起. 2.针对接口编程,而不是针 ...

  8. Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---工厂模式之简单工厂

    简单工厂:工厂依据传进的参数创建相应的产品. http://www.cnblogs.com/DelphiDesignPatterns/archive/2009/07/24/1530536.html { ...

  9. 【HeadFirst设计模式——开篇】

    近期在看HeadFirst,接下来的一段时间会陆续更新有关HeadFirst设计模式相关的文章.记得非常久之前在学习大话设计模式的时候,仅仅是走马观花的大致走过一遍.至于里面非常多东西都掌握的不是非常 ...

  10. HeadFirst设计模式<2>

    HeadFirst设计模式<2> 1 装饰者模式 星巴克咖啡 饮料 总结 如果说策略模式是通过组合实现弹性,那么装饰者模式就是通过继承来实现,在实现的同时,客户基本感觉不到使用了装饰者模式 ...

随机推荐

  1. mac本地搭建svn

    mac系统默认已经安装了svn,我们只需要配置并开启就可以了. 首先我们可以验证一下是否安装了svn,打开终端,输入命令 svnserve —version

  2. HTTP/2简介

    1.HTTP/2的定义: HTTP/2即超文本传输协议2.0,是HTTP/1.1下一代的协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (htt ...

  3. js 实现 多层级对象合并

    js 实现 多层级对象合并 首先 需求是使用js对数据的格式进行转换 把一个二维数组(包含层级信息,层级数是不固定的)list 转换为多层级的对象 我的思路就是 循环先把list里单条信息转换为 多层 ...

  4. iOS开发-CoreMotion框架

    转自: CoreMotion是一个专门处理Motion的框架,其中包含了两个部分 加速度计和陀螺仪,在iOS4之前加速度计是由 UIAccelerometer 类 来负责采集数据,现在一般都是用Cor ...

  5. HDU-3727 Jewel

    Jimmy wants to make a special necklace for his girlfriend. He bought many beads with various sizes, ...

  6. unix环境高级编程中的err_quit,err_sys用到的知识点

    unix环境高级编程中的err_quit,err_sys 环境 os CentOS release 6.7 (Final) gcc 4.4.7 c语言预备知识 标准输入输出文件 在linux系统中一切 ...

  7. springboot搭建一个简单的websocket的实时推送应用

    说一下实用springboot搭建一个简单的websocket 的实时推送应用 websocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 我们以前用的http协议只能单 ...

  8. Node.js:深入浅出 http 与 stream

    原文链接:https://github.com/iNuanfeng/blog/issues/4 作者:暖风叔叔 前言 stream(流)是Node.js提供的又一个仅在服务区端可用的模块,流是一种抽象 ...

  9. VMware中Bridged、NAT、host-only三种网络连接模式的原理及其区别

    VMnet0:这是VMware用于虚拟桥接网络下的虚拟交换机: VMnet1:这是VMware用于虚拟Host-Only网络下的虚拟交换机: VMnet8:这是VMware用于虚拟NAT网络下的虚拟交 ...

  10. Android(常用)主流UI开源库整理

    这几天刚做完一个项目..有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下.后来想了一下,既然要整理,就把网上常用的 AndroidUI界面的主流开源库 一起整理一下,方便查看. ...