桥接模式

桥接模式


          桥接模式:将抽象部分与它的实现部分分离,使他们都可以独立的变化。

          桥接模式在某种意义上,可以理解为前端与后端的关系,可以把桥梁模式当作帮助你编码前端和后端独立变化的框架,也就是相当于一个桥梁的作用。

          在实际应用中,不仅实现部分和抽象部分所提供的接口可以完全不一样,而且实现部分内部、抽象部分内部的接口也完全可以不一样,但是实现部分要提供类似的功能才行。

          这里的抽象部分和实现部分不是我们通常认为的父类和子类,接口和实现类的关系,而是组合关系,就是说实现部分是被抽象部分调用,用来完成实现抽象部分的功能。

          抽象与它的实现分离,并不是说,让抽象类与其派生类分类,因为这没有任何意义,实现指的是抽象类和它的派生类用来实现自己的对象。

          实现的方式有多种,桥接模式的核心意图就是把这些实现独立出来,让它们各自的变化,这就使得美中实现的变化不会影响其他实现,从而达到应对变化的目的。


桥接模式_第1张图片


          具体组成:

          抽象(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、对于客户程序来说,你的实现细节是透明的。

你可能感兴趣的:(桥接模式)