设计模式系列之一:23种GoF设计模式概述

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)模式:一个动作的算法由多个步骤按照固定结构组成,而其中一些步骤的实现是多变的,就把这些多变的特定步骤放在子类中去重新定义。如从数据库加载数据的过程:连接、获取数据、处理数据、关闭连接,这个过程对于从数据库中获取任何数据的都是一样固定不变的,但是获取数据和处理数据对于不同的业务,他的实现细节是不一样的。
(0)

相关推荐

  • python patterns-Python中的设计模式集合

    创意设计模式 这些设计模式都是关于类实例化的.该模式可以进一步分为类创建模式和对象创建模式.虽然类创建模式在实例化过程中有效地使用了继承,但是对象创建模式有效地使用了委派来完成工作. 抽象工厂:创建多 ...

  • PHP设计模式之工厂方法模式

    PHP设计模式之工厂方法模式 上回说到,简单工厂不属于GoF的二十三种设计模式,这回可就来真家伙了,大名顶顶的工厂方法模式前来报道! GoF类图解释 工厂方法模式对比简单工厂来说,最核心的一点,其实就 ...

  • PHP设计模式之装饰器模式

    PHP设计模式之装饰器模式 工厂模式告一段落,我们来研究其他一些模式.不知道各位大佬有没有尝试过女装?据说女装大佬程序员很多哟.其实,今天的装饰器模式就和化妆这件事很像.相信如果有程序媛MM在的话,马 ...

  • 设计模式系列之二:23种GoF设计模式的分类

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

  • 面向对象23种设计模式系列(一)- 创建型设计模式

    本章是面向对象23种设计模式系列开篇,首先我们来看下什么是设计模式? 面向对象23种设计模式: 1.面向对象语言开发过程中,遇到的种种场景和问题,提出了解决方案和思路,沉淀下来就变成了设计模式. 2. ...

  • 23种设计模式入门 - 设计模式概述及七大原则

    设计模式的目的 使程序拥有更好的的 代码复用性(一次编译,处处运行[手动狗头]) 可读性(不可替代性堪忧呀) 可扩展性(新增功能时方便) 可靠性(新增功能后对旧功能没有影响) 高内聚,低耦合 设计模式 ...

  • 有点污,23 种设计模式的通俗解释

    有点污,23 种设计模式的通俗解释

  • 23种设计模式全解析

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

  • 如何学习23种设计模式及其思想?

    感觉设计模式是看着简单 ,但是一用就不会,23种设计模式,学的人头大,相信大家都是这样的 设计模式在程序员的面试中会被考到,通常是介绍其原理并说出优缺点.或者对比几个比较相似的模式的异同点.在笔试中可 ...

  • 23种设计模式入门 -- 单例模式

    单例模式:采用一定的方法,使得软件运行中,对于某个类只能存在一个实例对象,并且该类只能提供一个取得实例的方法. 分类: 饿汉式 静态常量方式 静态代码块方式 懒汉式 普通方式,线程不安全 同步方法方式 ...

  • 23种设计模式之原型模式

    原型模式 1.基本介绍 1)原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象. 2)原型模式是一种创建型设计模式,允许一个对象再创建另一个可定制的 ...

  • 细谈八种架构设计模式及其优缺点概述

    作者:风平浪静如马 一.什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果.哈哈,我理解,架构就是骨架,如下图所示: 人类的身体的支撑是主要由骨架来承担的,然后是其上 ...