[读书笔记] 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 设计模式 - 装饰者模式
本章讨论的是一种为对象增添特性的技术,它并不使用创建新子类这种手段. 装饰者模式可以透明地把对象包装在具有同样接口的另一对象之中,这样一来,你可以给一些方法添加一些行为,然后将方法调用传递给原始对象. ...
随机推荐
- react路由深度解析
先看一段代码能否秒懂很重要 这是app.js 全局js的入口 import React from 'react' import { render } from 'react-dom' import ...
- Javascript 布尔操作符总结
在一门编程语言中,布尔操作符的重要性堪比相等操作符.如果没有测试两个值关系的能力,那么诸如if...else和循环之类的语句就不会有用武之地了.在像javascript这样弱类型语言更有其妙用,让我们 ...
- IIS 架构解析
我们在使用ASP.NET平台做web开发的时候,经常会接触到IIS(Internet Information Services 互联网信息服务).这篇文章主要来介绍IIS7.0+的架构.IIS的安全脆 ...
- 使用ajax和js无刷新改变页面内容和地址栏URL
发现一个可以改变地址栏,而不导致页面刷新的东东. Chrome, FF测试通过,不支持IE. 实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的 ...
- 关于easyUI的模态对话框
本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文地址.博客园蜗牛cnblogs.com/tdws 会用easyUI的模态对话框会是我们的开发更加简洁,只需下载这个插件,把需要的文件拖到项目 ...
- 【C#】第3章补充(一)如何在WPF中绘制正弦曲线
分类:C#.VS2015 创建日期:2016-06-19 使用教材:(十二五国家级规划教材)<C#程序设计及应用教程>(第3版) 一.要点 本例子提前使用了教材第13章介绍的基本知识. 二 ...
- android FragmentActivity+FragmentTabHost+Fragment框架布局
这周比较闲,计划系统的学习一下android开发,我本是一名IOS程序员,对手机开发还是有自己的一套思路的, 固这套思路用到我当前学android上了,先选择从Main页面的tabbar部分代码入手, ...
- Scalaz(17)- Monad:泛函状态类型-State Monad
我们经常提到函数式编程就是F[T].这个F可以被视为一种运算模式.我们是在F运算模式的壳子内对T进行计算.理论上来讲,函数式程序的运行状态也应该是在这个运算模式壳子内的,也是在F[]内更新的.那么我们 ...
- LR--Controller的Pacing设置(不容忽视的设置)
运行时的Pacing设置主要影响什么? Pacing主要用来设置重复迭代脚本的间隔时间.共有三种方法: A:上次迭代结束后立刻开始. B:上次迭代结束后等待固定时间. C:按固定或随机的时间间 ...
- Typescript 中类的继承
Typescript中类的定义与继承与后端开发语言java/C#等非常像,实现起来非常方便,而且代码便于阅读. 用Typescript写较大项目时是非常有优势的. /** * BaseClass */ ...