23种GoF设计模式概述

在前面,我们对 GoF 的 23 种设计模式进行了分类,这里先对各个设计模式的功能进行简要介绍,以便有个大概了解。后面的章节再进行详细介绍。

创建型模式

关注于怎么创建对象的创建型模式,他们将对象的创建与使用相互分离,对象的使用者无需关心如何创建对象,只知道怎么使用就行,以降低耦合度。犹如汽车使用人无需关注汽车是怎么造出来一样,只要知道怎么使用就行。下面这5种模式就是属于这一类。

  • 单例(Singleton)模式:控制某个类只能自行生成一个可供外部全局访问的实例。例如:Windows的窗口管理器或者任务管理器都是只有一个实例。
  • 原型(Prototype)模式:将一个创建成本高(如:装载大文件、初始化耗时长、CPU资源占用多等)的对象作为原型,通过对其进行复制或者克隆,来创建其他类似的新实例。
  • 抽象工厂(Abstract Factory)模式:由继承自抽象工厂类的具体工厂分别来创建有相同联系的多个不同产品。例如不同的培训学校,可以创建课程和课程所用的教材。
  • 建造者(Builder)模式:针对一个复杂对象,它的构建需要很多步骤和部件,将这种对象拆解成多个相对简单的构成部件或者步骤,然后再根据需要分别构建他们,直到得到该复杂对象。例如:快餐店的套餐,他的构造分别由汉堡、饮料、薯条构成,这就要求建造或制作者分别创建各种物品,然后返回一个完整的套餐给点餐人员。
  • 工厂方法(Factory Method)模式:由继承自抽象工厂类的具体工厂来决定生成什么具体产品。例如都属于家具厂的沙发工厂、桌椅工厂和床厂分别生产沙发、桌椅和床这些家具。

结构型模式

这种模式关注如何将对象和类按照某种方式一起来构成新的、更大、更有效果的低耦合结构,这种组成方式用于类结构的继承、和用于对象结构的组合或聚合。具有组合或聚合关系的各对象之间要比继承关系的各对象之间的耦合度弱,这样对象结构要比类对象具有更低的耦合度。属于结构模式的7种设计模式如下:

  • 桥接(Bridge)模式:该模式含有两个类,一个抽象类和实现类,在抽象类中(注意,这里的抽象类不是继承里面所说的抽象类)通过对现实类的引用(该引用就像桥一样把抽象类和实现类连接了起来),来实现了抽象与实现分离,使它们都可以进行独立变化。这种模式采用了组合关系,而不是继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
  • 装饰(Decorator)模式:动态地给对象增加新的状态和行为,来使其获得其他额外的功能。这种扩展功能的方式比采取继承来生成子类的实现方式更为灵活。这种模式关键点是装饰器在继承被装饰类的同时又包含它的实例。
  • 代理(Proxy)模式:客户端通过代理对象来间接地访问某个复杂对象。代理在这里作为复杂对象的微型接口,起到了控制着访问该复杂对象的功能,这些控制包括而限制、强化、验证或修改该对象的一些特性。代理模式最常见的如一些访问远程服务的本地代理类。
  • 外观(Facade)模式:基于多个复杂的子系统的接口,在其上面提供一个更高层次的对外的一致的接口,方便这些子系统已被使用和访问。例如一键购物,其中订单,送货地址、收款等都在此一步完成,这里就用到了外观模式。
  • 享元(Flyweight)模式:根据是否随着环境变化,区分出对象可变和不可变两种状态,也就是外部状态和内部状态,将不变的内部状态作为共享部分需要实现的公共接口,可变的外部以参数的形式传入方法,以此来支持大量细粒度对象的复用。
  • 组合(Composite)模式:将对象进行层次结构化组合,如树状层次结构,使得用户可以以同样的方式对一个或者一组对象进行处理。也就是说用户对单个对象和组合对象具有一致的访问性。例如Windows的文件资源管理器,你可以对一个文件、一个文件夹进行同样的操作。
  • 适配器(Adapter)模式:为了解决接口的不兼容问题,将一个类的接口转换成客户可以使用的另外一个接口,使得他们可以一起工作。例如,你要使用第三方组件,但是你目前系统中的接口跟其不同,而你又不愿意对其改动,就需要使用适配器来解决这种问题。

行为型模型

行为型模式用于处理多个类或对象之间如何交互及相互协作的问题或者说运行时的流程控制,对象职责的分配和算法控制都属于他的处理范畴。下面11种设计模式就属于这种类型:

  • 职责链(Chain of Responsibility)模式:将多个具有共同接口的请求处理器对象连成一条处理链条,请求从链中第一个对象开始往后传递,直到请求被处理为止。报销审批的逐级上报就是典型的例子。
  • 命令(Command)模式:将请求封装成命令对象来解耦请求发出者与执行者之间的关系。餐厅点餐就是一个具体的例子,菜单时命令,厨师时接收者,服务员或者顾客就是命令发出者。
  • 观察者(Observer)模式:一个对象和一个或多个对象之间存在着依赖关系,当这个对象状态发生改变时,相关依赖的对象就会自动得到通知并做出相应响应。这种模式也叫做发布-订阅模式。如客户关注的热销产品价格的变动与客户的关系。
  • 中介者(Mediator)模式:建立一个中间人来处理多个对象之间的相互交互。这样各对象都变成了跟中间人交互,而不是对象之间的相互交互。这样可以降低对象间的耦合度,使原有对象之间不必直接相互引用。就如一个网状结构变成了一个星状结构,彼此间依赖减少。例如微信群就是一个典型的中介者例子,所有群员可以通过微信群之间相互交互,而不是彼此之间进行。
  • 状态(State)模式:针对有状态的对象,将其改变状态的行为抽取封装到状态中,这样有状态的对象在其内部状态发生改变时,其行为也发生了改变,从而改变了对象的行为。这种模式常见于工作流或者游戏等系统中。例如,经费的批准有未办、正在审核、正在处理、已经完成等状态。
  • 迭代器(Iterator)模式:对于聚合对象中的集合元素,在不用了解其内部结构的情况下,给其提供一种可以顺序访问该集合的接口。常见如图片浏览应用,其中可以通过首图、上一张,下一张、末图来查看图片,就是典型的迭代器模式应用。
  • 访问者(Visitor)模式:在不改变原有类型定义的情况下,对在已有结构中的所有元素上定义并执行新操作。这样,每个元素都可以提供多种新操作,即每个元素有多个访问者对象访问,并对其执行新的操作。常见如超市购买的商品,各种各样,有的需要称重,有的需要打包,收银员需要对他们扫码计价,这些不同的操作都可以通过访问者模式来实现。
  • 备忘录(Memento)模式:如果要记录某一对象的状态变化以便在某一时刻进行恢复,则该对象就可以将其以前状态以备忘录(对象)方式进行封装,并将备忘录对象交给备忘录管理器进行管理存放,以便后续使用。我们常见的撤销(Undo)就是这种方式实现。
  • 策略(Strategy)模式:很多时候,对于给定的问题有很多种算法或者策略来解决。为了避免将这些所有算法以条件分支语句放在宿主类中,我们可以将每个算法抽离出来形成一个具有类,所有这些算法都继承或实现一个同样的抽象类或接口,并用一个上下文环境类对其各算法或策略进行选择和持有,并作为客户端的入口。例如各种排序算法就可以用这种方式来组织。
  • 解释器(Interpreter)模式:用于解释用一种语言或者表示法定义的指令或语句。类似于编译器来解释代码。
  • 模板方法(Template Method)模式:一个动作的算法由多个步骤按照固定结构组成,而其中一些步骤的实现是多变的,就把这些多变的特定步骤放在子类中去重新定义。如从数据库加载数据的过程:连接、获取数据、处理数据、关闭连接,这个过程对于从数据库中获取任何数据的都是一样固定不变的,但是获取数据和处理数据对于不同的业务,他的实现细节是不一样的。

23种GoF设计模式概述的更多相关文章

  1. 002-创建型-00-简单工厂【非23种GOF设计模式】

    一.概述 简单工厂模式是属于创建型模式,又叫做静态工厂方法(Static Factory Method)模式,但不属于23种GOF设计模式之一. 简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实 ...

  2. 23种GoF设计模式的分类

    GoF设计模式一共有23个.一般可以按目的和作用范围来进行划分,具体划分方法如下: 第一,这些模式按目的(即完成什么样任务)来划分为创建型.结构型和行为型这三种模式: 创建型:用来创建对象.单例.原型 ...

  3. 23种经典设计模式UML类图汇总

    在这里23种经典设计模式UML类图汇总       创建型模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基 ...

  4. javaEE Design Patter(1)初步了解23种常用设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. ...

  5. 23种常用设计模式的UML类图

    23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源码)与<设计模式:可复用面向对象软件的基础>(源码)两书中介绍的设计模式与UML图. 整 ...

  6. 转载:23种常用设计模式的UML类图

    转载至:https://www.cnblogs.com/zytrue/p/8484806.html 23种常用设计模式的UML类图 本文UML类图参考<Head First 设计模式>(源 ...

  7. OOAD-设计模式(二)之GRASP模式与GOF设计模式概述

    一.GRASP模式(通用责任分配软件模式)概述 1.1.理解责任 1)什么是责任 责任是类间的一种合约或义务,也可以理解成一个业务功能,包括行为.数据.对象的创建等 知道责任——表示知道什么 行为责任 ...

  8. GoF设计模式 - 概述

    掌握编程语言仅仅意味着掌握了如何给计算机"下命令",而到底要计算机如何去做,怎么指挥,则是另一个问题--如何编程.设计模式是一套程序员的"武功套路",它教我们如 ...

  9. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

随机推荐

  1. 设计模式(十七)Observer模式

    在Observer模式中,当观察对象的状态发生变化时,会通知给观察者.Observer模式适用于根据对象状态进行相应处理的场景. 首先看一下示例程序的视图. 然后用实际代码来理解这种设计模式. pac ...

  2. Mysql数据库(九)备份与恢复

    一.数据备份 1.使用mysqldmp命令备份 (1)备份一个数据库 mysqldump -u root -p dbname table1 table2 ... > D:\BackName.sq ...

  3. 小程序多端差异调研报告(微信,支付宝,头条,QQ)

    已经使用uni-app开发并发布了一个跨端小程序啦,嘻嘻嘻!

  4. JS设置和获取盒模型的宽和高

    JS设置和获取盒模型的宽和高 dom.style.width/height:只能取出内联样式的宽度和高度 dom.currentStyle.width/height:获取即时的计算的样式,但是只有IE ...

  5. quartus使用串口IP模块

    在quartus平台中使用串口模块的IP,需要使用到platform designer软件来实现. 1.在quartus界面调出IP Catalog界面. 2.在IP catalog中搜索UART,找 ...

  6. MIT线性代数:5.转置,置换,向量空间

  7. MySQL 语句执行过程详解

    MySQL 原理篇 MySQL 索引机制 MySQL 体系结构及存储引擎 MySQL 语句执行过程详解 MySQL 执行计划详解 MySQL InnoDB 缓冲池 MySQL InnoDB 事务 My ...

  8. dianFanEditor Web在线编辑器

    个人很喜欢kodexplorer 的在线编辑器.苦于没有加载FTP目录的功能. 索性自己改造了一下,用.NET 做了几个WEB接口,用CEF3做浏览器内核,打包了在线地址做编辑器. 即可加载本地磁盘, ...

  9. html5 微信真机调试方法vConsole

    html5 微信真机调试方法 vConsolehttps://blog.csdn.net/weixin_36934930/article/details/79870240

  10. Ansible之常用模块(一)

    ansible之所以功能强大,不是ansible本身,是因为它有众多的模块,前文我们介绍了ansible的基础介绍,系列命令的用法以及选项的说明,通过前文的学习我们知道了ansible是基于pytho ...