桥接模式
桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化。
桥接模式在某种意义上,可以理解为前端与后端的关系,可以把桥梁模式当作帮助你编码前端和后端独立变化的框架,也就是相当于一个桥梁的作用。
在实际应用中,不仅实现部分和抽象部分所提供的接口可以完全不一样,而且实现部分内部、抽象部分内部的接口也完全可以不一样,但是实现部分要提供类似的功能才行。
这里的抽象部分和实现部分不是我们通常认为的父类和子类,接口和实现类的关系,而是组合关系,就是说实现部分是被抽象部分调用,用来完成实现抽象部分的功能。
抽象与它的实现分离,并不是说,让抽象类与其派生类分类,因为这没有任何意义,实现指的是抽象类和它的派生类用来实现自己的对象。
实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自的变化,这就使得美中实现的变化不会影响其他实现,从而达到应对变化的目的。
具体组成:
抽象(Abstraction )角色:它定义了抽象类的接口而且维护着一个指向实现(Implementor)角色的引用。
精确抽象( RefinedAbstraction)角色:实现并扩充由抽象角色定义的接口。
实现( Implementor)角色:给出了实现类的接口,这里的接口与抽象角色中的接口可以不一致。
具体实现( ConcreteImplementor)角色:给出了实现角色定义接口的具体实现。
为了解决变化给系统带来的影响,可以分析变化的种类,将不变的框架使用抽象类定义出来,然后,再将变化的内容使用具体的子类来分别实现。
这样,面临客户的只是一个抽象类,这种方式可以较好地避免,为抽象类中现有接口添加新的实现所带来的影响,缩小了变化的影响,但是,可能会造成子类数量的爆炸,并且在某些时候不是很灵活。
当这颗继承树上一些子树存在了类似的行为,这意味着这些子树中存在了几乎重复的功能代码,这时,我们不妨将这些行为提取出来,也采用接口的方式提供出来,然后以组合的方式将服务提供给原来的子类,这样,就达到了前端和被使用的后端独立的变化,而且还达到了后端的重用。
将抽象部分与它的实现部分分离,就是实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合。
桥接模式基本代码结构:
<span style="font-size:24px;">namespace 桥接模式 { class Program { static void Main(string[] args) { Abstraction ab = new RefinedAbstration(); ab.SetImplementor(new ConcreteImplementorA()); ab.Operation(); ab.SetImplementor(new ConcreteImplementorB()); ab.Operation(); Console.Read(); } } } //桥接模式基本代码 //Implementor类 abstract class Implementor { public abstract void Operation(); } //ConcreteImplimentorA和ConcreteImplementorB等派生类 class ConcreteImplementorA : Implementor { public override void Operation() { Console.WriteLine("具体实现A的方法执行"); } } class ConcreteImplementorB : Implementor { public override void Operation() { Console.WriteLine("具体实现B的方法执行"); } } //Abstraction类 class Abstraction { protected Implementor implementor; public void SetImplementor(Implementor implementor) { this.implementor = implementor; } public virtual void Operation() { implementor.Operation(); } } //RefinedAbstration类 class RefinedAbstration : Abstraction { public override void Operation() { implementor.Operation(); } }</span>
使用桥接模式的情况:
1、当你的系统中有多个地方要使用到类似的行为,或者是多个类似行为的组合时,可以考虑使用桥梁模式来提高重用,并减少因为行为的差异而产生的子类。
2、系统中某个类的行为可能会有几种不同的变化趋势,为了有效的将变化封装,可以考虑将类的行为抽取出来。
3、当然上面的情况也可以是这样,行为可能要被不同相似类使用,也可以考虑使用桥梁模式来实现。
桥接模式的优点:
1、桥梁模式使用了低耦合性的组合代替继承。
2、将可能变化的部分单独封装起来,使得变化产生的影响最小,不用编译不必要的代码。
3、抽象部分和实现部分可以单独的变动,并且每一部分的扩充都不会破坏桥梁模式搭起来架子。
4、对于客户程序来说,你的实现细节是透明的。