[读书笔记] 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 设计模式 - 装饰者模式
本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象. ...
随机推荐
- 用Qt写软件系列五:一个安全防护软件的制作(2)
引言 在上一篇中讲述了主窗体的创建和设计.主窗体的无边框效果.阴影效果.拖动事件处理.窗体美化等工作在前面的博客中早就涉及,因此上篇博文中并未花费过多笔墨.这一篇继续讲述工具箱(Tool Button ...
- NET RichTextBox控件如何可以插入图像
本文介绍.NET RichTextBox控件如何可以插入图像,控制和ActiveX对象通过使用OLE方式,如在解释,.不幸的是,它涵盖了只用一个C源代码样本,所以我需要在托管代码(C#)实施类似的解决 ...
- Ajax代码简单封装。
function ajax(url, onsuccess, onfail) { var xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest( ...
- 【转】持久化消息队列之MEMCACHEQ
G MEMCACHEQ AS MESSAGE QUEUE PHP,消息队列,MEMCACHEQ 使用消息队列(MESSAGE QUEUE)可以把某些耗时的工作推后,然后在后台慢慢地去执行,这样就不会让 ...
- Spring注解@Value的用法
有时候我们在配置文件中使用配置的信息不仅需要在xml文件中使用,还可能在类中使用,这个时候,我们可使用@Value注解了: @Value("${rest.service.url}" ...
- 如何很好的Review自己的代码
写这篇博文的原因是因为自己写的代码经常会因为返工,delay项目的交付日期.总结了一下引起项目delay的原因,大概有如下几点: 在没有完全深熟悉需求交互细节的情况下:诸如根据不同渠道设置不同的订单状 ...
- Java分布式开发
分布式概念的引入是基于性能的提升,应用的可靠性而提出的.所谓Java分布式,即是在使用Java语言进行企业级应用开发的过程中,采用分布式技术解决业务逻辑的高并发.高可用性的一些架构设计方案. 1. R ...
- Java面试题汇总(一)
1.谈谈你对http中post和get访问的理解. http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认 为: ...
- 选中没有选中的复选框,匹配含有某个字符串的正则,json取值的两种方法,把变量定义在外面跟里面的区别
一.筛选没有选中的复选框:not("input:checked") 二.匹配有VARCHAR的字符串:".*VARCHAR.*?" 三.json取值的两种方法 ...
- Webpack - CommonJs & AMD 模块打包器
Webpack 是一个 CommonJs & AMD 模块打包器.可以把你的 JavaScript 代码分离为多个包,在需要的时候进行加载,支持预处理文件,例如 json, jade, cof ...