定义
将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
桥接模式是一种对象结构型模式,它又被称为柄体模式或接口模式。桥接模式用一种巧妙的方式处理多层继承存在的问题,用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系,使得系统更加灵活,并易于扩展,同时有效控制了系统中类的个数。
举例
例如有毛笔和蜡笔两种画笔,假如需要大、中、小3种型号的画笔,能够分别绘制12种不同的颜色,如果使用蜡笔,需要准备3×12=36支,但如果使用毛笔,只需要提供3种型号的毛笔,外加一个包含12种颜色的调色板即可,涉及的对象个数仅为3+12=15,远远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对应的蜡笔需增加12支,毛笔只需增加一支即可
可以看到,在毛笔中,颜色和型号是两种不同的维度,而蜡笔中两种型号耦合在一起,对其中一个进行扩展和改变都会影响另外一个
在桥接模式中,将两个独立变化的维度(例如画笔的型号与颜色)设计为两个独立的继承等级结构,而不是将二者耦合在一起形成多层继承结构。
桥接模式在抽象层建立起一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。
结构
- (1)
Abstraction
(抽象类):它是用于定义抽象类的接口,通常是抽象类而不是接口,其中定义了一个Implementor
(实现类接口)类型的对象并可以维护该对象,它与``Implementor`之间具有关联关系,既可以包含抽象业务方法,也可以包含具体业务方法。 - (2)
RefinedAbstractio
n(扩充抽象类):它扩充由Abstraction
定义的接口,通常情况下不再是抽象类而是具体类,实现了在Abstraction
中声明的抽象业务方法,在RefinedAbstraction
中可以调用在Implementor
中定义的业务方法。 - (3)
Implementor
(实现类接口):它是定义实现类的接口,这个接口不一定要与Abstraction 的接口完全一致,事实上这两个接口可以完全不同。一般而言,Implementor
接口仅提供基本操作,而Abstraction
定义的接口可能会做更多更复杂的操作。Implementor接口对这些基本操作进行了声明,而将具体实现交给其子类。通过关联关系,在Abstraction
中不仅可以拥有自己的方法,还可以调用Implementor
中定义的方法,使用关联关系来替代继承关系。 - (4)
Concretelmplementor
(具体实现类):它具体实现了Implementor
接口,在不同的ConcreteImplementor
中提供基本操作的不同实现,在程序运行时,ConcreteImplementor
对象将替换其父类对象,提供给抽象类具体的业务操作方法。
实现
abstract class Implementor
{
public abstract void Operation();
}
class ConcreteImplementorA : Implementor
{
public override void Operation()
{
Console.WriteLine("具体实现A的方法执行");
}
}
class ConcreteImplementorB : Implementor
{
public override void Operation()
{
Console.WriteLine("具体实现B的方法执行");
}
}
abstract class Abstraction
{
protected Implementor implementor; //定义实现类接口对象
public void SetImplementor(Implementor implementor)
{
this.implementor = implementor;
}
public virtual void Operation() //声明抽象业务方法
{
implementor.Operation();
}
}
class RefinedAbstraction: Abstraction
{
public override void Operation()
{
implementor.Operation(); //调用实现类的方法
}
}
class Program
{
static void Main(string[] args)
{
Abstraction ab = new RefinedAbstraction();
ab.SetImplementor(new ConcreteImplementorA());
ab.Operation();
ab.SetImplementor(new ConcreteImplementorB());
ab.Operation();
}
}
优点
- (1)分离抽象接口及其实现部分。
- (2)减少子类个数
- (3)桥接模式提高了系统的可扩展性
缺点
- (1)桥接模式由于有抽象层,这样就增加了理解和设计难度
- (2)桥接模式要求正确识别出系统中两个独立变化的维度﹐因此其使用范围具有一定的局限性
使用环境
- (1)如果一个系统需要在抽象化和具体化之间增加更多的灵活性,避免在两个层次之间建立静态的继承关系,通过桥接模式可以使它们在抽象层建立一个关联关系。
- (2)抽象部分和实现部分可以以继承的方式独立扩展而互不影响,在程序运行时可以动态地将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合。
- (3)一个类存在两个(或多个)独立变化的维度,且这两个(或多个)维度都需要独立地进行扩展。
- (4)对于不希望使用继承或因为多层继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。