【笔记】Head First 设计模式

原文在下面的链接
https://github.com/PoBlue/small_script/tree/master/head-first-design-pattern

Head First 设计模式 的笔记

12 个常用的设计模式,以一段说明,一张 UML 图的形式记录,方便学习和回顾

因为书里主要是以 Java 为主的,所以要有一点了解,还需一点对象的基础

Table of Contents

=================

OO原则

  • 封装变化
  • 多用组合,少用继承
  • 针对接口编程,不针对实现编程
  • 为交互对象之间的松耦合设计而努力
  • 类应该对扩展开放,对修改关闭
  • 依赖抽象,不要依赖具体类
  • 只和朋友交谈
  • 别找我,我会找你
  • 类应该只有一个改变的理由

策略模式

用到的原则

  1. 将变化和不变化的地方找出来,分离
  2. 针对接口编程,而不是针对实现编程(接口就是所谓的抽象一层的东东,而不单指 java 接口)
  3. 多用组合,少用继承 (意思是少用继承来分离代码)

第 25 页练习

head-first-pratice-p25.png

观察者模式

原则

  1. 以松耦合的方式让一系列对象沟通状态(让格对象数据的派发和观察不耦合在一起)

第 56 页练习

head-first-pratice-p56.png

装饰者模式

用到的新原则

  1. 对扩展开放,对修改关闭(让基本的数据不变,通过扩展让类增加功能或者加强原有功能)

优缺点

  1. 优点:让类经常会修改变化的方法或者功能通过扩展来增加灵活性
  2. 缺点:会定义十分多的类,一不留神会让程序变得复杂

第 91 页的例子

head-first-pratice-p91.png

工厂模式

简单工厂

说明

  1. 就是简单的把创建对象的语句抽离出去,作为一个对象

第 117 页的例子

head-first-pratice-p117.png

工厂方法

用到的原则

  1. 依赖倒置,依赖抽象,不要依赖具体类

说明

  1. 将创建对象的方法放到子类里面,要子类决定创建,还让子类可以修改它们的行为

第 134 页的例子

head-first-pratice-p134.png

抽象工厂

指导方针规则

  1. 变量不可以持有具体的引用 (意思是:不能写死)
  2. 不要让类派生具体类(意思是:根源的类不能够是具体类, 要依赖抽象)
  3. 不要覆盖基类中已实现的方法(意思是:如果根源的类是改变了它继承类的方法,那么它就不适合被别的类继承了)

说明

  1. 如果类里面有一系列的类, 那么可以通过抽象工厂来提供这一系列的类的对象,方便以后快速更改配置

第 156 页的例子

head-first-pratice-p156.png

单件模式

意义

确保一个类只有一个实例,并提供一个全局的访问点

例子

并没有,这个主要关注代码层面的,留意一下多线程访问的问题就好了

命令模式

说明

请求 封装成对象,以便使用不同的请求,队列或者日志来参数化其它对象。命令模式也支持可撤销操作。

其中的 请求 意思是:让相应的类执行相应的操作

意义

  1. 命令模式将发出请求的对象和执行请求的对象解耦 (就是将调用者和被执行者进行解耦)
  2. 将对象执行的动作封装起来

第 206 页的例子

将执行变为一种请求


head-first-pratice-p206.png

第 207 页的例子

调用者 invoker 会在某时刻,调用命令对象的 execute()

head-first-pratice-p207.png

适配器模式

说明

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间

第 243 和 244 页的例子

一个利用接口,一个利用多重继承来实现

head-first-pratice-p243.png
head-first-pratice-p244.png

外观模式

说明

提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。

规则

  • 最少知识原则:只和你的密友对话
  • 意思是:减少对象之间的交互,只留几个 "密友" 对象

方针

只调用以下范围的方法

  • 该对象本身 (自身)
  • 被当做方法的参数而传递进来的对象 (输入)
  • 此方法所创建或实例化的任何对象 (自身生成的对象)
  • 对象的任何组件 (自身拥有的对象关系)

第 264 页的例子

head-first-pratice-p264.png

模板方法模式

说明

  • 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
  • 模板方法使得子类可以在不改变算法结构的情况, 重新定义算法中的某些步骤
  • 意思:模板方法定义了一个算法的步骤,允许子类为一个或多个步骤提供实现
  • 工厂方法是模板方法的一种特殊版本

钩子

  • 可以在模板方法里面提供 "默认不做事的方法" (钩子)
  • 子类可以视情况决定要不要覆盖它们
  • 如:一些 Activity 或者 Controller 的 willLunch 等就是用 hock 实现的

什么时候用:

  • 当方法必须实现就用 抽象方法
  • 当非必须就用 钩子

好莱坞原则

  • 别调用(打电话给)我们,我们会调用(打电话给)你
  • 意思:防止 依赖腐败 避免高组件依赖底层组件,底层又依赖高层,高层又依赖侧边
  • 总之:就是避免让高层和低层组件之间有明显的环状依赖
  • 由超类主控一切

第 289 页的例子

head-first-pratice-p289.png

迭代器与组合模式

迭代器模式

说明

  • 提供一种方法: 顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
  • 意思是:封装不同的集合 (collection) 类型的遍历代码
  • 集合 (collection) 指的是一群对象, 可以以各种数据结构存储,如数组,散列表,列表
  • 集合 (collection) 也可称为聚合 (aggregate)
  • 把游走的任务放在迭代器上,而不是聚合上。能简化聚合的接口和实现,让责任各得其所

单一责任原则

  • 一个类应该只有一个引起变化的原因
  • 类的每个责任都有改变的潜在区域。超过一个责任,意味着超过一个改变的区域

第 331 页的例子

head-first-pratice-p331.png

第 336 页的例子

head-first-pratice-p336.png

组合模式

说明

  • 允许将对象组合成树形的结构来表现 整体/部分 层次结构
  • 能让客户以一致的方式处理个别对象和组合对象
  • 意思:处理的时候,可以忽略对象组合和个别对象之间的差别

第 358 页的例子

head-first-pratice-p358.png

状态模式

说明

  • 允许对象在内部状态改变时改变它的行为
  • 对象看起来好像修改了它的类
  • 意思:让对象基于内部状态而拥有不同的行为

状态模式 vs 策略模式

策略模式:

  • 继承之外的一种弹性替代方案
  • 能通过组合不同的对象来改变行为
  • 需用行为或者算法来配置 Context 类

状态模式:

  • 允许 context 随着状态而改变行为
  • 替代 context 里的条件判断,将行为包装进状态对象中
  • 改变 context 里的状态对象,即可改变 context 的行为
  • 状态类可以被多个 Context 实例共享

第 410 页的例子

head-first-pratice-p410.png

代理模式

说明

  • 为另一个对象提供一个替身或占位符以控制对这个对象的访问
  • 意思:提供另一个对象作为代表,控制客户对真对象的访问, 就是在真对象上面加上一层代理

如何让客户使用代理,而不是真正的对象

使用工厂模式, 按需实例化相应的代理

第 461 页的例子

head-first-pratice-p461.png

模式

说明

  • 在某情景 (context) 下,针对某问题的某种解决方案
  • 一个模式是解决一个经常重复发生的设计问题

用模式思考

  • KISS 原则, 保持简单(keep it simple, stupid),尽可能用最简单的方式解决问题
  • 何时需要模式,加入模式是要应对可能发生的 实际改变, 而不是 假想的改变
  • 重构的时间就是模式的时间
  • 如果现在不需要,就别做。如果只是 假想的改变, 就不要添加这个模式, 因为这只会增加系统的复杂度

反模式

说明

  • 告诉你如何采用一个不好的解决方案解决一个问题
  • 不但要了解正例,也要了解一下反例嘛
  • 这里有更多反模式的讨论:wiki

剩下的模式

下面都是成熟,典型,正式的四人组模式,只不过没有前面的模式那么经常地被使用。

书中也是作为附录的形式记录的,就直接引用 wiki 了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,829评论 1 331
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,603评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,846评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,600评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,780评论 3 272
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,695评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,136评论 2 293
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,862评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,453评论 0 229
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,942评论 2 233
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,347评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,790评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,293评论 3 221
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,839评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,448评论 0 181
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,564评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,623评论 2 249

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,050评论 18 139
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,811评论 1 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,275评论 18 399
  • 本文首发于个人博客:Lam's Blog - 谈谈23种设计模式在Android源码及项目中的应用,文章由Mark...
    格子林ll阅读 4,523评论 1 105
  • 今天把星期天的作业都写完了,语文做的还挺好,数学错一片片的,给他批出来让他改,他说不会,让我跟他一块改,错那么...
    刘湘皓阅读 91评论 0 0