设计模式系列之一: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)模式:一个动作的算法由多个步骤按照固定结构组成,而其中一些步骤的实现是多变的,就把这些多变的特定步骤放在子类中去重新定义。如从数据库加载数据的过程:连接、获取数据、处理数据、关闭连接,这个过程对于从数据库中获取任何数据的都是一样固定不变的,但是获取数据和处理数据对于不同的业务,他的实现细节是不一样的。
作者:MarkKang
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。