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