读书笔记:Head First 设计模式

HeadFirst设计模式 Eric Freeman

PDF下载(亲测有效):https://baijiahao.baidu.com/s?id=1756899911272841212&wfr=spider&for=pc

前言

如何使用本书

一些Head First学习原则:

  1. 可视化。图片更容易让人记住,文字放图片里
  2. 使用会话式和个人化风格。会话式讲述内容。
  3. 让学习者想得更深
  4. 引起并保持读者的注意。大脑注意的是意料之外的东西
  5. 触动读者的情绪。记住东西依赖于情感内容。

学习方法:

  1. 慢一点。你理解的越多,要记的就越少
  2. 做练习。自己做笔记
  3. 阅读“没有蠢问题”
  4. 你放下书后要有空间让大脑处理消化
  5. 喝水
  6. 大声说出来,解析给别人听
  7. 倾听大脑的声音,达到刚看就忘的点就休息
  8. 融入到故事中
  9. 设计实践

源代码:http://wickedlysmart.com/head-first-design-patterns

1 欢迎来到设计模式:设计模式介绍 1

有人已经解决过你的问题
继承:Duck类,橡皮鸭子也开始飞
接口:fly()从Duck类拿出做成单独接口

取出变化的部分,并把它“封装”起来,这样它就不会影响其他代码

没有蠢问题:问,答

2 让你的对象保持消息灵通:观察者模式 37

出版者 + 订阅者 = 观察者模式

出版者:主题 subject
订阅者:观察者 observer

3 装饰对象:装饰者模式 79

4 用OO的精髓做烘焙:工厂模式 109

制造对象,不仅只有使用new操作符。
当使用new操作符时,无疑是在实例化一个具体类。

Duck duck = new MallardDuck()
抽象类保持代码弹性    创建一个具体类的实例

通过类型参数决定实例化具体类

if(type.equals("chesse")){
	Pizza = new chessePizza();
}

接下来就会不断修改这部分代码
区别哪些代码不会改变,封装
好处就是把问题推迟到另一个对象
简单工厂

定义工厂方法模式

工厂方法模式:子类决定要实例化哪个类。“决定”就是指用那个子类创建实例化产品。

依赖倒置原则

依赖抽象,不依赖具体类
pizzastore 高层组件 依赖 pizza抽象类,mystrlepizza低层组件

5 独一无二的对象:单件模式 169

独一无二的对象

public static synchronized
              同步,线程进入此方法前要先等待轮询到它
              但同步导致性能开销大

6 封装调用:命令模式 191

封装调用

把小块计算包装成形,以便调用计算的对象不需要操心如何做事情

命令模式简介

  1. 顾客把订单给女招待
  2. 女招待把订单给柜台。女招待只管传递订单
  3. 厨师根据订单准备餐点

撤销按钮

undo() 方法
用undocommand记住上一条命令

命令模式的更多用途:请求队列

日志请求

添加store() load()记录操作日志与恢复

7 随遇而安:适配器和外观模式 237

适配器模式解析

适配器实现目标接口,并持有被适配者的实例

定义适配器模式

将一个类的接口转换成客户期望的另一个接口

现实世界的适配器

枚举器
迭代器

观赏电影(困难方式)

看电影,需要执行一系列任务

灯、相机、外观

外观类把家庭影院组件看作子系统。

定义外观模式

为子系统中的一组接口提供了一个统一的接口
最重要的事情之一是务必记得模式示意图。

最少知识原则

只和你的密友谈话
所有设计都有折中:抽象与速度。空间与实践。原则是指南

8 封装算法:模板方法模式 277

抽象coffee和tea

两份冲泡法都遵循相同的算法
把冲泡步骤抽象

final void prepareRecipe(){// 模板
	brew();
	addCondiments(); // 加调料
}
abstract void addCondiments();

抽象出公共部分
模板方法定义一个算法的步骤,允许子类提供一个或多个步骤的实现。

好莱坞原则

不要打电话(调用)给我,我会打电话(调用)给你
举例:饮料的客户依赖模板方法类,不依赖具体Tea类,只有需要实例化时才调用子类方法。

9 管理良好的集合:迭代器和组合模式 317

有很多方法可以把对象堆起来成为集合。数组,栈,列表。但这些会把内部实现展示给客户。
迭代器封装了内部的循环遍历

定义迭代器模式

提供一种方式,访问聚合对象中的元素而不暴露其潜在实现

单一责任原则

一个类应该只有一个变化的原因。类的每个责任都是一个潜在变化的区域

定义组合模式

允许你将对象组合成树形结构来表现部分-整体层次结构。

10 事物的状态:状态模式 381

鲜为人知的事实:策略和状态模式是双胞胎,刚出生就分开了。

状态模式定义

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

11 控制对象访问:代理模式 425

你是一个白脸,和蔼友善。但你不希望每个人都叫你做事。因此找了个黑脸控制对你的访问。

远程代理的角色

客户对象调用本地“代理”对象上的方法,代理对象处理所有网络通信的低层细节。

Java RMI概况

RMI命名:RMI将客户辅助对象称为stub(桩),服务辅助对象称为skeleton(骨架)

定义代理模式

为另一个对象提供一个替身或占位符来控制对这个对象的访问。
使用代理模式创建代表对象。代表对象控制对另一个对象的访问,被代表的对象可以是远程的对象,创建开销大的对象或需要安全控制的对象。

虚拟代理(virtual proxy)

client --> proxy --> RealSubject(开销大的对象)

12 模式的模式:复合模式 493

模式的模式

认识模型-视图-控制器

13 现实世界中的模式:更好地与设计模式相处 563

14 附录:剩下的模式 597

posted @ 2024-09-14 21:46  liqinglucky  阅读(12)  评论(0编辑  收藏  举报