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. Flask使用bootstrap为HttpServer添加上传文件功能

    关于模态框 使用bootstrap实现点击按钮弹出窗口,简直不要太简单.我们只需要将写好的窗口内容隐藏,然后调用bootstrap的框架即可,简单几行就能完成相关功能实现.... 前提条件是,我们需要 ...

  2. AI:为你写诗,为你做不可能的事

    最近,一档全程高能的神仙节目,高调地杀入了我们的视野: 没错,就是撒贝宁主持,董卿.康辉等央视名嘴作为评审嘉宾,同时集齐央视"三大名嘴"同台的央视<主持人大赛>,这够不 ...

  3. 想实现多人协作的“在线Excel”?真没那么简单

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel是我们办公中常用的工具 ,它几乎能为我们处理大部分数据,友好的交互 ...

  4. mysql的安装及命令

    1.先检查系统是否装有mysql rpm -qa | grep mysql 2.下载mysql的repo源 wget     http://192.168.130.150/mysql5.7.26/my ...

  5. Redis 中的数据库

    前面我们花了很多的时间介绍了 redis 中基本的数据结构,及其内部的实现情况,这些都是非常基础的东西,可能不经意间你就会用到他们,希望你花点时间了解一下. 接下来,我们将走近 redis 数据库,学 ...

  6. flex布局的兼容问题

    一.W3C各个版本的flex 2009 version 标志:display: box; or a property that is box-{*} (eg. box-pack) 2011 versi ...

  7. AtCoder-3856

    An adult game master and N children are playing a game on an ice rink. The game consists of K rounds ...

  8. HDU2833-WuKong(求不同起点,终点最短路的交点最多数量)

    Liyuan wanted to rewrite the famous book "Journey to the West" ("Xi You Ji" in C ...

  9. 20.DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件

    一 认证组件 1. 局部认证组件 我们知道,我们不管路由怎么写的,对应的视图类怎么写的,都会走到dispatch方法,进行分发, 在咱们看的APIView类中的dispatch方法的源码中,有个sel ...

  10. 插入排序 C&&C++

    (blog主要用于展示算法流程) 插入排序算法:通过对未排序的数据逐个插入合适的位置而完成排序工作       流程: (1)先对数组前两个数据进行从小到大排序 (2)将第三个数据与前两个数据比较,将 ...