设计模式之桥接模式

桥接模式是结构型设计模式,桥接模式自己应对的是因为实际的须要,使用不一样纬度的条件和方法,桥接模式能够将两个类型分离出来,让二者之间均可以独立的拓展,让每个类都更加符合单一职责。桥接模式与多层继承方案有些不太相同,它让两个独立变化的设计成为两个独立的继承等级的类,而且在抽象简历一个抽象关系,该关系相似一条链接两个继承结构的桥。编程

桥接模式用了一种巧妙的方式处理多层继承存在的问题,用抽象关联取代传统的多层继承关系,将类与静态继承关系转换成动态的对象组合关系,是得系统更加灵活,易于拓展,同时有效的控制系统类中类的个数。设计模式

什么是桥接模式

桥接模式:桥接模式是将抽象部分与它的实现部分分离,使它们均可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(interface)模式。 ——节选自百度百科this

桥接模式经过将继承改成组合的方式来解决这个问题。具体来讲,就是抽取其中一个维度并使之成为独立的类层次, 这样就能够在初始类中引用这个新层次的对象,从而使得一个类没必要拥有全部的状态和行为。桥接模式主要应对的是因为实际的须要,某个类具备两个或者两个以上的维度变化,若是只是用继承将没法实现这种须要,或者使得设计变得至关臃肿。spa

桥接模式优缺点

桥接模式中的抽象部分持有具体实现部分的接口,最终目的是经过调用具体实现部分的接口中的方法,进一步完成必定的功能,这跟直接使用接口没有什么差别,只是表现形式略有不一样而已。其次,使用接口的客户程序也能够持有相应的接口对象,这样从形式上就同样了。也就是说,从某个角度来说,桥接模式是面向抽象编程这个设计原则的扩展。设计

正是经过具体实现的接口,把抽象部分和具体的实现分离开来,抽象部分至关因而使用实现部分接口的客户程序,这样抽象部分和实现部分就松散耦合了,从而能够实现相互独立的变化。这样一来,几乎能够把全部面向抽象编写的程序,都视做是桥接模式的体现,至少算是简化的桥接模式,就算是广义的桥接吧。code

优势
  1. 能够建立与平台无关的类和程序
  2. 客户端代码仅与高层抽象部分进行互动,不会接触到平台的详细信息
  3. 新增抽象部分和实现部分之间不会互相影响
  4. 抽象部分专一于处理高层逻辑,实现部分处理平台细节
缺点

对高内聚的类使用桥接模式可能会让代码更加复杂化对象

示例

桥接模式的主要角色以下:blog

  1. 抽象部分:提供高层控制逻辑,依赖于完成底层实际工做的实现对象
  2. 实现部分:为全部具体实现声明通用接口。抽象部分仅能经过在这里声明的方法于实现对象交互
  3. 实现具体:包括特定于平台的代码
  4. 精确抽象:提供控制逻辑的变体,与其父类同样,他们经过通用实现接口与不一样的实现进行交互
  5. 客户端:仅关心如何与抽象部分合做。可是,客户端须要将抽象对象与一个实现对象链接起来

类图以下所示:继承

image

代码示例:接口

// 实现接口角色
interface Implementor {
    doSomething() : void;
    doAnything() : void;
}

// 具体实现角色
class ConcreteImplementor1 implements Implementor {
    public doSomething() : void {

    }
    public doAnything() : void {

    }
}
class ConcreteImplementor2 implements Implementor {
    public doSomething() : void {

    }
    public doAnything() : void {
        
    }
}

// 抽象类
abstract class Abstraction {
    private imp : Implementor;
    constructor(imp : Implementor) {
        this.imp = imp;
    }

    // 自身的行为和属性
    public request() : void {
        this.imp.doSomething();
    }
}
// 具体抽象化角色
class RefinedAbstraction extends Abstraction {
    constructor(imp : Implementor) {
        super(imp);
    }

    public request() : void {
        // 本身写一些处理业务
        super.request();
    }
}

// 调用
// 定义一个实现化角色
const imp : Implementor = new ConcreteImplementor1();
// 定义一个抽象化角色
const abs : Abstraction = new RefinedAbstraction(imp);
// 执行上下文
abs.request();

总结

若是一个系统须要在构建的抽象化角色和具体化角色之间增长更多的灵活性,避免在两个层次之间简历静态的继承关系,经过桥接模式可使他们在抽象层创建关系。

抽象化角色和实现化角色能够以继承的方式独立扩展而互不影响,在程序运行时能够动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统须要对抽象化角色和实现化角色进行动态耦合。

相关文章
相关标签/搜索