常用设计模式小结

  • 2019 年 12 月 26 日
  • 筆記

现在你已经准备好迎接一个充满设计模式的崭新世界。 但是,在你打开所有的机会大门之前,我们需要告诉你一些即将在真实世界中遇到的细节–没错,外面的世界还是比较复杂的。来吧,接下来,我们会指引你的方向……

定义设计模式

在看完之前这么多章节的系列,相信作为读者的你已经基本了解什么是设计模式了。但我们至今还未给它一个正式的定义。我们先拿出一个常用的定义:

模式:是在某情境下,针对某问题的某种解决方案。 情境就是应用某个模式的情况。这应该是会不断出现的情况。(例如:你拥有一个对象的集合) 问题就是你想在某情境下达到的目标 ,但也可以是某情境下的约束。(你需要注意走访每个对象,而且不需理会该集合的实现) 解决方案就是你所追求的:一个通用的设计,用来解决约束、达到目标。(将迭代封装进分离的类中)

这是一个需要花些时间逐步理解的定义。在这里,我帮你们找到了一个记忆的方法:

“如果你发现自己处于某个情境下,面对着所欲达到的目标被一群约束影响着的问题,然后,你能够应用某个设计,克服这些约束并达到该目标,将你领向某个解决方案。”

组织设计模式

对着发掘的设计模式数目逐渐增加,有必要将他们分门别类,好将他们组织起来,以简化我们寻找模式的过程,并让同一群组内的模式互相比较。

我们感觉模式的目标分成三个不同类目:创建型、行为型和结构型。

小编先来引导下,这三个类型的基本定义。

创建型模式涉及到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。

行为型模式涉及到类和对象如何交互及分配职责。

结构型模式可以让你把类或对象组合到更大的结构中。

现在有了基本的定义,请先停顿下,给自己几分钟时间来给设计模式分类,然后再看下面小编整理的分类。

创建型

行为型

结构型

单例(singleton)

模板方法(Template Method)

装饰(Decorator)

工厂(Factory Method)

命令(Command)

组合(Composite)

抽象工厂(Abstract Factory)

观察者(Observer)

适配器(Adapter)

建造者(Builder)

迭代器(Iterator)

代理(Proxy)

原型(Prototype)

状态(State)

外观(Facede)

策略(Strategy)

享元(Flyweight)

中介者(Mediator)

桥接(Bridge)

访问者(Visitor)

备忘录(Memento)

解释器(Interpreter)

责任链(Chain of Responsibility)

其中未加粗部分还没系统学习过,在稍后的章节,还会做一些简单的介绍。

除了刚才的分类之外 ,模式还有另一种分类方式:模式所处理的类或对象

类模式描述类之间的关系如何通过继承定义。类模式的关系是在编译时建立的。

对象模式描述对象之间的关系,而且主要是利用组合定义。对象模式的搞关系通常在运行时建立,而且更加动态、更有弹性。

对象

模板方法(Template Method)

单例(singleton)

工厂(Factory Method)

装饰(Decorator)

适配器(Adapter)

命令(Command)

解释器(Interpreter)

组合(Composite)

抽象工厂(Abstract Factory)

观察者(Observer)

建造者(Builder)

迭代器(Iterator)

代理(Proxy)

原型(Prototype)

状态(State)

外观(Facede)

策略(Strategy)

享元(Flyweight)

中介者(Mediator)

桥接(Bridge)

访问者(Visitor)

备忘录(Memento)

责任链(Chain of Responsibility)

用模式思考问题

小编在这里根据书本,还整理了一份快速指南,可以帮助你开始“用模式思考”。所谓“用模式思考”,意思就是说,能够看着设计,体会在什么地方模式能自然适用,在什么地方模式则不能。

  1. 保持简单

首先,当你设计时,尽可能地用最简单的方式解决问题。你的目标应该是简单,而不是“如何在这个问题中应用模式”。如果没有使用模式解决某个问题,千万不要以为你就不是一个经验丰富的开发人员。如果你能保持简单的设计,那岂不是更好,甚至你还能得到其他开发人员的欣赏和尊敬呢。

所以,正确的做法就是,为了要让你的设计简单而且有弹性,有时候使用模式是最好的办法,但不是每次都需要使用。

  1. 设计模式非灵丹妙药

如果所知道的,模式是解决一再发生的问题的通用方案。模式已经被许多开发人员实际测试过。所以,当你需要某个模式的时候,可以放心地使用它,毕竟你知道这个模式已经身经百战。

然后,模式并非灵丹妙药。你需要考虑到模式对你的设计中其他部分所造成的后果。

  1. 你知道何时需要模式

这是最重要的问题:何时使用模式?当你在设计的时候,如果确定在你的设计中可以利用某个模式解决某个问题,那么就是用这个模式!如果有更简单的解决方案,那么在决定是用模式之前应该先考虑这个方案。

如何知道何时是用一个模式,这就需要经验和知识了。一旦你确定一个简单的解决方案无法满足你的需要,应该考虑这个问题以及相关的约束–这可以帮你将问题对应到一个模式中。如果你对模式有很深的认知,就可能知道有什么模式适合这样的情况。否则,就花些时间调查一下可能会解决这个问题的模式,模式类目中的意图和应用部分会特别有用。

  1. 拿掉你所不需要的

何时应该删除这个模式呢?当你的系统变得非常复杂,而且并不需要预留任何弹性的时候,就不要使用模式。换句话说,也就是当一个比较简单的解决方案比使用模式更好的时候,你就不需要使用。

  1. 如果你现在不需要,就别做

如果你今天在设计中有实际的需要去支持改变,就放手采用模式处理这个改变。但是,如果说理由只是假想的,就不要添加这个模式,因为这只会将你的系统搞越复杂,而且很可能你永远都不会需要它。

最后,将模式和描述配对

在这篇文章的最后,还是给大家一个十足的干货,将之前所学的设计模式和描述进行配对,让你对这些常用的模式有一个更加深刻的印象,让你学习有成。

模式

描述

装饰者

包装一个对象,以提供新的行为

状态

封装了基于状态的行为,并使用委托在行为之间切换

迭代器

在对象的集合之中游走,而不暴露集合的实现

外观

简化一群类的接口

策略

封装可以互换的行为,并使用委托来决定要使用哪一个

代理

包装对象,以控制对此对象的访问

工厂方法

由子类决定要创建的具体类是哪一个

适配器

封装对象,并提供不同的接口

观察者

让对象能够在状态改变时被通知

模板方法

由子类决定如何实现一个算法中的步骤

组合

客户用一致的方式处理对象集合和单个对象

抽象工厂

允许客户创建对象的家族,而无需指定他们的具体类

命令

封装请求成为对象

小结

至此,《Head First 设计模式》一书,历时五个月,小编把书中详细介绍的模式基本都学习并输出了一遍。其中,第12章有个复合模式,讲述的是一个MVC使用设计模式的过程,小编还需要消化,也怕输出起来影响大家的学习,故就断了这个念头。

还有11章的代理模式,小编挑选了Hollis在博客上的文章来学习,力求能让大家看的更好,小编在此和大家道歉。很感谢,从头到尾一直和小编学习的读者,设计模式系列,还有最后的输出,小编会继续努力,把这个系列用更好的方式完结。