HeadFirst设计模式 Eric Freeman
PDF下载(亲测有效):https://baijiahao.baidu.com/s?id=1756899911272841212&wfr=spider&for=pc
前言
如何使用本书
一些Head First学习原则:
- 可视化。图片更容易让人记住,文字放图片里
- 使用会话式和个人化风格。会话式讲述内容。
- 让学习者想得更深
- 引起并保持读者的注意。大脑注意的是意料之外的东西
- 触动读者的情绪。记住东西依赖于情感内容。
学习方法:
- 慢一点。你理解的越多,要记的就越少
- 做练习。自己做笔记
- 阅读“没有蠢问题”
- 你放下书后要有空间让大脑处理消化
- 喝水
- 大声说出来,解析给别人听
- 倾听大脑的声音,达到刚看就忘的点就休息
- 融入到故事中
- 设计实践
源代码: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
封装调用
把小块计算包装成形,以便调用计算的对象不需要操心如何做事情
命令模式简介
- 顾客把订单给女招待
- 女招待把订单给柜台。女招待只管传递订单
- 厨师根据订单准备餐点
撤销按钮
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(开销大的对象)