《Head First 设计模式》整理

简介: 对《Head First 设计模式》中的常用设计模式的整理,其实很多模式我们在开发中都有用到,但是在此之前没有一种理论基础支撑自己,有了这些知识后,更有利于做好程序的设计工作,以及遇到一些设计问题时知道如何取舍。

《Head First 设计模式》中的常用设计模式的整理,其实很多模式我们在开发中都有用到,但是在此之前没有一种理论基础支撑自己,有了这些知识后,更有利于做好程序的设计工作,以及遇到一些设计问题时知道如何取舍。


策略模式

作用

通过组合不同的算法,为系统提供运行时动态地改变行为的功能,使系统具有更大的弹性。

定义

定义了算法族,把它们分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户之上。

类图结构

这里写图片描述


观察者模式

作用

通过使用观察者模式,使多个对象之间松耦合,但是它们依然可以交互,但是不用清楚彼此的细节。

定义

定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

类图结构

这里写图片描述


装饰器模式

作用

装饰者可以在被装饰者的行为前面或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,从而达到某种特定的目的。

定义

动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。

类图结构

这里写图片描述


工厂方法模式

作用

通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。

定义

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

类图结构

这里写图片描述


抽象工厂模式

作用

抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道(或关心)实际产出的具体产品是什么,这样一来,客户就从具体的产品中被解耦。

定义

提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

类图结构

这里写图片描述


工厂方法与抽象工厂的区别

坦白说,工厂方法与抽象工厂的相似度很高,从类图上看很难将它们理清楚,但是从定义上来看的话会发现它们的区别主要是在设计层次上,以我们大家熟悉的电子产品为例,如果有两个产品:手机、电脑,用工厂方法表示苹果和三星的类图:
这里写图片描述
从品牌的角度上来看,两家厂商生产不同的手机和电脑,这样的工厂方法很清晰;但是如果我们把生产条件做的更细致一点的话,比如苹果面向中国的产品和面向美国的产品是不同的,面向中国大陆销售的产品是阉割过的,而美国的是全功能的,用抽象工厂表示就像这样:
这里写图片描述
抽象工厂的每一个子类都像是一个工厂方法,就像抽象工厂的定义所说的那样:用于创建相关或依赖对象的家族。


单件模式

作用

创建一个独一无二的对象。

定义

确保一个类只有一个实例,并提供一个全局访问点。

类图结构

这里写图片描述


命令模式

作用

通过统一的接口操作不同的对象,使系统能够轻易的实现多种目的。

定义

将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

类图结构

这里写图片描述


适配器模式

作用

适配器可以将改变的接口封装起来,客户就不必为了应对不同的接口而每次跟着修改。

定义

将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。

类图结构

这里写图片描述


外观模式

作用

将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。

定义

提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

类图结构

这里写图片描述


模板方法模式

作用

将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。

定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

类图结构

这里写图片描述


迭代器模式

作用

让我们能游走于集合中的每一个元素,而又不暴露其内部的表示。

定义

提供一种方法顺序访问一个集合对象中的各个元素,而又不暴露其内部的表示。

类图结构

这里写图片描述


组合模式

作用

能够创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项组。

定义

允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

类图结构

这里写图片描述


状态模式

作用

将状态封装成独立的类,并将动作委托到代表当前状态的对象,使行为随着内部状态而改变。

定义

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

类图结构

这里写图片描述


代理模式

作用

让代理对象控制对某个对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。

定义

为另一个对象提供一个替身或占位符以控制对这个对象的访问。

类图结构

这里写图片描述
代理是个复杂的模式,变种颇多,不同的变种甚至就有不同的类图。


OO设计原则:

  1. 封装变化
  2. 多用组合,少用继承
  3. 针对接口编程,不针对实现编程
  4. 为交互对象之间的松耦合设计而努力
  5. 类应该对拓展开放,对修改关闭
  6. 依赖抽象,不要依赖具体类
  7. 只和朋友交谈
  8. 别找我,我会找你
  9. 类应该只有一个改变的理由
目录
相关文章
|
设计模式
Head First 设计模式 —— 04. 工厂 (Factory) 模式
Head First 设计模式 —— 04. 工厂 (Factory) 模式
322 0
|
设计模式
Head First 设计模式 —— 03. 装饰器 (Decorator) 模式
Head First 设计模式 —— 03. 装饰器 (Decorator) 模式
324 0
|
设计模式 JavaScript Java
Head First 设计模式 —— 02. 观察者 (Observer) 模式
Head First 设计模式 —— 02. 观察者 (Observer) 模式
258 0
|
设计模式 算法 Java
Head First 设计模式 - 01. 策略 (Strategy) 模式
Head First 设计模式 - 01. 策略 (Strategy) 模式
347 0
|
设计模式 数据可视化 知识图谱
Head First 设计模式 —— 00. 引子
Head First 设计模式 —— 00. 引子
344 0
|
监控 C#
气象站的故事--Head First设计模式
现在我们要为一家气象站开发一套气象监控系统,按照客户的要求,这个监控系统必须可以实时跟踪当前的天气状况(温度、湿度、大气压力),并且可以在三种不同设备上显示出来(当前天气状况、天气统计、天气预测)。客户还希望这个系统可以对外提供一个API接口,以便任何开发者都可以开发自己的显示设备,然后无缝挂接到系统中,系统可以统一更新所有显示设备的数据。
781 0