1.1 简介
1.1.1 概述
桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化,简单来说,就是将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形,如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。Bridge 模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
1.1.2 优缺点
优点:
① 抽象与实现分离,扩展能力强
② 符合开闭原则、符合合成复用原则、其实现细节对客户透明
缺点:
① 由于聚合关系建立在抽象层,要求开发者针对抽象化进行设计与编程,能正确地识别出系统中两个独立变化的维度,这增加了系统的理解与设计难度。
1.2 案例
我们来举个例子解释下上图,假如有一个几何 形状类(即上图中的 Abstraction), 从它能扩展出两个子类: 圆形 和 方形。对这样的类层次结构进行扩展以使其包含颜色, 所以创建名为 红色 和 蓝色 形状子类。但是,由于已有两个子类,所以总共需要创建四个类才能覆盖所有组合,例如 蓝色圆形 和 红色方形,在层次结构中新增形状和颜色将导致代码复杂程度指数增长。
问题的根本原因是我们试图在两个独立的维度——形状与颜色——上扩展形状类(即上图中的 Implementation)。这在处理类继承时是很常见的问题。桥接模式通过将继承改为组合的方式来解决这个问题。根据该方法,我们可以将颜色相关的代码抽取到拥有 红色 和 蓝色 两个子类的颜色类中,然后在形状类中添加一个指向某一颜色对象的引用成员变量。现在,形状类可以将所有与颜色相关的工作委派给连入的颜色对象。这样的引用就成为了 形状 和 颜色 之间的桥梁。此后,新增颜色将不再需要修改形状的类层次,反之亦然。