设计模式简介

一直想总结一下设计模式,已经拖了大半年了,今天正式开始吧。

什么是设计模式?

设计模式(Design pattern)是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。 设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。 项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

设计模式的由来

设计模式(Design pattern)是由GOF 在他们的书---Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)中首次提出。 GOF (四人帮,全拼Gang of Four),代表了四个人(Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides ),他们在1994年合著了上面说的这本书。 他们所提出的设计模式主要是基于以下的面向对象设计原则。

  • 对接口编程而不是对实现编程。
  • 优先使用对象组合而不是继承。

设计模式的四个基本要素

一般而言,一个模式有四个基本要素:

  1. 模式名称(pattern name) 一个助记名,它用一两个词来描述模式的问题、解决方案和效果。命名一个新的模式增加了我们的设计词汇。设计模式允许我们在较高的抽象层次上进行设计。基于一个模式词汇表,我们自己以及同事之间就可以讨论模式并在编写文档时使用它们。模式名可以帮助我们思考,便于我们与其他人交流设计思想及设计结果。找到恰当的模式名也是我们设计模式编目工作的难点之一。
  2. 问题(problem) 描述了应该在何时使用模式。它解释了设计问题和问题存在的前因后果,它可能描述了特定的设计问题,如怎样用对象表示算法等。也可能描述了导致不灵活设计的类或对象结构。有时候,问题部分会包括使用模式必须满足的一系列先决条件。
  3. 解决方案(solution) 描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。
  4. 效果(consequences) 描述了模式应用的效果及使用模式应权衡的问题。尽管我们描述设计决策时,并不总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及好处具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统的灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。

设计模式的两个主要用途

开发人员的共同平台

设计模式提供了一个标准的术语系统,且具体到特定的情景。例如,单例设计模式意味着使用单个对象,这样所有熟悉单例设计模式的开发人员都能使用单个对象,并且可以通过这种方式告诉对方,程序使用的是单例模式。

最佳、最快速的解决方案

设计模式已经经历了很长一段时间的发展,他们提供了软件开发过程中面临的一般问题的最佳解决方案。学习这些模式有助于经验不足的开发人员通过一种简单会计的方式来学习软件设计,和快速和优雅的实现某一类场景的程序。

设计模式描述了设计的组成成分,它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定而具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

设计模式使人们可以更加简单方便地复用成功的设计体系结构。将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。

Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素)一共提到了23种设计模式,其实还有一些小型的或者子设计模式,比如简单工厂模式,再比如代理模式又分为远程代理、保护代理等等。

设计模式的分类

设计模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。

创建型模式:提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用新的运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 结构型模式:这类设计模式关注类和对象的组合,继承的概念被用来组合接口以及定义组合对象获得新功能的方式。 行为型模式:这类设计模式更关注对象之间的通信。 据说还有两类:并发性模式 和 线程池模式,这两种还没接触过?。

类型

包含的模式

创建型模式

工厂方法模式(Factory Method Pattern)</br>抽象工厂模式(Abstract Factory Pattern)</br>单例模式(Singleton Pattern)</br>建造者模式(Builder Pattern)</br>原型模式(Prototype Pattern)

结构型模式

适配器模式(Adapter Pattern)</br>桥接模式(Bridge Pattern)</br>组合模式(Composite Pattern)</br>装饰器模式(Decorator Pattern)</br>外观模式(Facade Pattern)</br>享元模式(Flyweight Pattern)</br>代理模式(Proxy Pattern)

行为型模式

策略模式(Strategy Pattern)</br>模板方法模式(Template Method Pattern)</br>观察者模式(Observer Pattern)</br>迭代器模式(Iterator Pattern)</br>责任链模式(Chain of Responsibility Pattern)</br>命令模式(Command Pattern)</br>备忘录模式(Memento Pattern)</br>状态模式(State Pattern)</br>访问者模式(Visitor Pattern)</br>中介者模式(Mediator Pattern)</br>解释器模式(Interpreter Pattern)

各种设计模式之间的关系

参考: 百度百科-设计模式 http://www.runoob.com/design-pattern/design-pattern-intro.html 书籍: 《Head First 设计模式》 《设计模式 - 可复用的面向对象软件元素》 《设计模式之禅》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CDA数据分析师

飞跃式发展的后现代 Python 世界

如果现代Python有一个标志性特性,那么简单说来便是Python对自身定义的越来越模糊。在过去的几年的许多项目都极大拓展了Python,并重建了“Python...

22560
来自专栏java工会

深度思考编程的艺术

17980
来自专栏take time, save time

你所能用到的数据结构(六)

八、数据结构不一定很枯燥   正如我现在实习的公司的一个同事说的那样,数据结构是一本催眠的书,我想对于大多数人应该是这样的,当然对我也是,看着一大堆的算法,结...

34450
来自专栏nimomeng的自我进阶

探索命名之美(二)

大家在编码或者读代码的过程中,对于什么样的命名是好的命名可能认知不是特别清晰,但是对于什么样的命名是坏的命名应该一目了然,他们包括:

8620
来自专栏晨星先生的自留地

一道小CTF

38840
来自专栏AzMark

Python字符串、循环及练习

25640
来自专栏大闲人柴毛毛

三分钟理解“简单工厂模式”——设计模式轻松掌握

实际问题: 由于超市隔三差五就要办促销活动,但每次促销活动的方式不一样,所以需要开发一个软件,营业员只要输入原价再选择活动类型后,就能计算出折扣以后的价钱。 普...

389120
来自专栏C/C++基础

面向对象设计的五项基本原则

面向对象设计(OOD)是面向对象编程(OOP)必不可少的一个环节,只有好的设计,才能保障程序的质量。面向对象设计的主要任务就是类的设计,不少面向对象(OO)的先...

7620
来自专栏java一日一条

重构 改善既有代码的设计--笔记

查看一个类是否“过大”,这里有一个小技巧分享给大家。就是看两点:1)这个类实例变量太多,必然会有Duplicated Code(重复代码) 2)类内如果有太多代...

11940
来自专栏老九学堂

学习C语言的用途以及如何快速掌握C语言

C是基础的语言 被广泛用于操作系统和编译器的开发 功能非常强 虽然现在不是最流行但它是 最基础的东西 也是比较好学的语言 如:金山的创始人江明 从30...

45470

扫码关注云+社区

领取腾讯云代金券