张子阳的博客

首页 读书 技术 店铺 关于
张子阳的博客 首页 读书 技术 店铺 关于

图解设计模式

2019-6-25 张子阳 推荐: 5 难度: 3

很早前就看过《设计模式:可复用面向对象软件的基础》,那时候刚入行不久,对于面向对象开发还不熟悉,对Smalltalk这样的语言更是陌生,所以看起来晦涩难懂,翻了大概三分之一就束之高阁了。过了几年以后,又再看了一个简单版的《Head first设计模式》。现在又过去了几年,像设计模式这种属于计算机基础,值得一看再看熟记于心,所以就又买了一本重读了一遍。

这本是看过的图解系列的第3本书了,很早前看的第一本《图解HTTP协议》觉得不错,就又买了该系列的其他书。然而因为作者不是同一个人,所以质量也不是全然相同,但这个系列的书都是图文并茂比较容易理解的。这本书的作者和《程序员的数学》是同一个人,但是比起那本书,这本书要更好一些。《程序员的数学》写的实在过于浅显了。这本书总得来说很不错,不像原书那样艰涩,又不像Head First那样啰嗦,语言比较简练,例子举得也不错,推荐一读。

这本书将23个模式分为了10个部分,进行了分别讲述。比原书的“创建型模式”、“结构型模式”、“行为模式”划分的更细致一些。每个模式都是先引出一个问题,然后借助模式解决这个问题,再给出模式的标准UML图。因为是由实际问题入手,所以理解上更轻松一些。

看书只是有个大概的印象,还是要自己实现一遍代码才会理解的更深刻,如果在项目中进行应用,就会理解得更加透彻了。这里简单把各个模式的类图罗列下来,有时间了就回头翻一下,所以下面的图只对读过书的人才有意义(其实很大程度上是方便我自己查阅 ...)。

第1部分 适应设计模式

Iterator

迭代器,将遍历对象的逻辑抽离了出来。

Adapter

使用继承
使用委托

接口不匹配时创建Adapter,然后进行一个功能的“转发”。

第2部分 交给子类

Template Method

最基础的一个模式,简单的都不像一个模式了。基类实现算法,调用自身的抽象方法,子类实现具体的方法。

Factory Method

将“框架”和“具体加工”分离了出来。

第3部分 生成实例

Singleton

全局只有一个实例,也是很常用的模式,重点是私有构造函数,和静态实例。

Prototype

通过对现有类的复制来生成实例,而不是通过new。因为重新new一个对象可能会很慢,或者是根据类生成实例过于复杂时。需要注意实现复制是深度复制还是浅度复制。

Builder

类图
时序图

用来组装复杂的对象。

Abstract Factory

将关联的组件组成最终产品。需要注意的是在创建工厂实例时,使用了反射。

第4部分 分开考虑

Bridge

类的功能层次结构:父类-->子类-->孙类;类的实现层次结构:父类(抽象方法)-->子类实现1、父类-->子类实现2。

Strategy

这也是一种常见的模式:整体替换算法。

第5部分 一致性

Composite

适合用来遍历树形结构。

Decorator

装饰物与被装饰物具有一致性。用来不改变现有类,为现有类增加功能。

第6部分 访问数据

Visitor

将数据结构与处理分离出来。

Chain of Resposibility

将处理的类形成一个链条。

第7部分 简单化

Facade

隐藏复杂性,对外部只通过facade类暴露少量接口。

Mediator

经常用在UI层,有点类似js中的react/redux模式,相互关联的组件,由一个统一的类进行协调更新。

第8部分 管理状态

Observer

发布/订阅模式,当状态变化时,通知到订阅者。

Memonto

保存对象状态

State

State,用类来代表状态,避免过多的if-else状态判断语句。

第9部分 避免浪费

Flyweight

避免创建过多实例,客户端共享已经创建好的实例。

Proxy

只在必要时才创建实例,该实例通常是一个重型对象(创建比较耗时的对象,例如发起远程连接之类)。

第10部分 用类来表现

Command

类图
时序图

将命令表示成类。

Interpreter

通常用来进行语法分析,例如分析正则表达式,将markdown转义成html等。

感谢阅读,希望这篇文章能给你带来帮助!