[读书笔记] Head First 设计模式
OO基础
- 抽象
- 封装
- 多态
- 继承
OO原则
| 原则 | 描述 |
| 封装变化 |
找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混合在一起。 把会变化的部分取出来并“封装”起来,好让其他部分不受到影响。 |
| 多用组合,少用继承 |
使用组合建立系统具有很大的弹性,不仅可以将“算法族”封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为。 |
| 针对接口编程,不针对实现编程 | 针对接口编程,真正的意思是针对“超类型”编程,关键就在多态。 |
| 为交互对象之间的松耦合设计而努力 | |
| 类应该对外扩展开放,对修改关闭 | |
| 依赖倒置原则 |
要依赖抽象,不要依赖具体类。 该原则相对于“针对接口编程,不针对实现编程”来说,更加强调“抽象”。 该原则说明: 1. 不能让高层组件依赖低层组件 1.1 当你直接实例化一个对象时,就是在依赖它的具体实现 1.2 所谓"高层"组件,是由其他低层组件定义其行为的类 2. 不管高层组件还是低层组件,都应该依赖抽象 |
| 最少知识原则(墨忒耳法则) | 只和你的密友谈话 |
| 好莱坞原则 |
别调用(打电话给)我们,我们会调用(打电话给)你 将决策权放在高层模块中,以便决定如何以及何时调用低层模块。 |
| 单一原则 | 一个类应该只有一个引起变化的原因 |
OO模式
模式不是代码,而是针对设计问题的通用解决方法。
模式是在某情境下,针对某问题的某种解决方案。
模式是工具而不是规则,需要被适当第调整以符合你的需求。
| 模式 | 描述 |
| 装饰者 | 包装一个对象,以提供新的行为。不改变接口,但加入责任 |
| 状态 | 封装基于状态的行为,并使用委托在行为之间切换 |
| 迭代器 | 在对象的集合之中游走,而不暴露集合的实现 |
| 外观 | 提供子系统的一个简化接口,简化一群类的接口 |
| 策略 | 使用组合封装算法。封装可互换的行为,然后使用委托来决定要采用哪一个行为 |
| 代理 | 包装对象,以控制对此对象的访问 |
| 工厂方法 | 由子类决定实例化哪个具体类。 |
| 适配器 | 封装对象,将一个接口转换成另一个接口 |
| 观察者 | 当某个状态改变时,允许一群对象能被通知到 |
| 模板方法 | 使用继承封装算法。子类决定如何实现算法中的步骤 |
| 单件 | 确保有且只有一个对象被创建 |
| 组合 | 客户用一致的方式处理对象集合和单个对象 |
| 抽象工厂 | 允许客户创建对象的家族,而无需指定他们的具体类。 |
| 命令 | 封装请求成为对象 |
模式可以按照下面的来分类
| 类别 | 描述 | 模式 |
| 创建型模式 | 创建型模式涉及到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。 |
Builder Prototype 工厂模式 简单工厂模式 |
| 行为型模式 | 只要是行为型模式,都涉及类和对象如何交互及分配责任。该模式的目的是对象之间的沟通与互联。 |
Visitor Mediator Memento Interpreter Chain of Responsibility |
| 结构型模式 | 结构型模式可以让你把类和对象组合到更大的结构中。用来描述类和对象如何被组合以建立新的结构或新的功能。 |
Bridge Flyweight |
同样,也可以按照下面的方式来分
| 类别 | 描述 | 模式 |
| 类模式 | 描述类之间的关系如何通过继承定义。类模式的关系是在编译时建立的。 |
Interpreter |
| 对象模式 | 描述对象之间的关系,而且主要是利用组合定义。对象模式的关系通常在运行时建立,而且更加动态、更具有弹性。 |
Bridge Flyweight Visitor Memento Chain of Responsibility Mediator Prototype Builder |
类图
策略模式

抽象工厂模式

代理模式

迭代器模式

工厂方法模式

观察者模式

简单工厂模式

命令模式

模板方法

适配器模式

外观模式

装饰者模式

状态模式

组合模式

[读书笔记] Head First 设计模式的更多相关文章
- 读书笔记之 - javascript 设计模式 - 接口、封装和链式调用
javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模 ...
- 读书笔记--Head First 设计模式 目录
1.设计模式入门 2.观察者模式 3.装饰者模式 4.工厂模式 5.单件模式 6.命令模式 7.适配器模式与外观模式 8.模板方法模式 9.迭代器与组合模式 10.状态模式 11.代理模式 12.复合 ...
- 读书笔记之 - javascript 设计模式 - 工厂模式
一个类或者对象中,往往会包含别的对象.在创建这种对象的时候,你可能习惯于使用常规方式,即用 new 关键字和类构造函数. 这会导致相关的俩个类之间产生依赖. 工厂模式,就是消除这俩个类之间的依赖性的一 ...
- 读书笔记之 - javascript 设计模式 - 责任链模式
责任链模式可以用来消除请求的发送者和接收者之间的耦合.这是通过实现一个由隐式地对请求进行处理的对象组成的链而做到的.链中的每个对象可以处理请求,也可以将其传给下一个对象. 责任链的结构: 责任链由多个 ...
- 读书笔记之 - javascript 设计模式 - 命令模式
本章研究的是一种封装方法调用的方式.命令模式与普通函数有所不同.它可以用来对方法调用进行参数化处理和传送,经过这样处理过的方法调用可以在任何需要的时候执行. 它也可以用来消除调用操作的对象和实现操作的 ...
- 读书笔记之 - javascript 设计模式 - 观察者模式
在事件驱动的环境中,比如浏览器这种持续寻求用户关注的环境中,观察者模式是一种管理人与其任务(确切的讲,是对象及其行为和状态之间的关系)之间的关系的得力工具.用javascript的话来讲,这种模式的实 ...
- 读书笔记之 - javascript 设计模式 - 代理模式
代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...
- 读书笔记之 - javascript 设计模式 - 享元模式
本章探讨另一种优化模式-享元模式,它最适合于解决因创建大量类似对象而累及性能的问题.这种模式在javascript中尤其有用,因为复杂的javascript代码很快就会用光浏览器的所有可用内存,通过把 ...
- 读书笔记之 - javascript 设计模式 - 装饰者模式
本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象. ...
随机推荐
- 快速击键(MyEclipse编写的QuickHit项目)
public class Level { private int levelNo;// 各级别编号 private int strLength;// 各级别一次输出字符串的长度 private int ...
- Sandcastle入门:创建C#帮助文档
Sandcastle入门:创建C#帮助文档 今天学到了一个东西:利用vs2005生成的dll/xml来生成帮助文档. 完成这个伟大任务的是Sandcastle,微软推出的类库文档编译工具. 在开始这篇 ...
- SignalR入门之多平台SignalR服务端
之前创建SignalR服务端是基于Web应用程序而言的.那么能不能把SignalR服务端做成控制台应用程序.Winform或windows服务呢? 答案是肯定的. 之前尽管看起来好像是IIS和ASP. ...
- mysql常用函数参考
mysql常用函数参考 对于针对字符串位置的操作,第一个位置被标记为1. ASCII(str) 返回字符串str的最左面字符的ASCII代码值.如果str是空字符串,返回0.如果str是NULL, ...
- UrlRewriter实现.NET的URL重写
首先下载安装MSDNURLRewriting.msi,链接地址http://pan.baidu.com/s/1c0pRnTu. 在安装目录下找到RewriterTester\bin\URLRewrit ...
- 不可或缺 Windows Native (14) - C++: 文件
[源码下载] 不可或缺 Windows Native (14) - C++: 文件 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 文件 示例CppIO2.h #prag ...
- SSH服务器与Android通信(1)--服务器端发送数据
很多应用要求SSH服务器不仅和PC通信,还要和Android移动设备通信,这时就需要用到JSON了.其基本原理是服务器将数据转换成JSON格式,发送给Android客户端,客户端再将JSON格式的数据 ...
- 使用attrs.xml自定义属性
控件有很多属性,如android:id.android:layout_width.android:layout_height等,但是这些属性都是系统自带的属性.使用attrs.xml文件,可以自己定义 ...
- 实现Android包的批量删除
由于手机内存有限,有时需要一次删除很多个包,这时就需要一个实现Android包批量删除的应用. 首先是布局文件: <?xml version="1.0" encoding=& ...
- DCloud与APICloud的对比
DCloud与APICloud这两家目前应该说是市场占有率和人气较高的国内团队:国内还有一些其他的方案如AppCan.exMobi之类的,但可能是商业运作手法上Big不够,近两年的名气不太大,但各自其 ...