桥接模式

97 阅读2分钟

基本概念

桥接模式(Bridge Pattern)又称桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。使用组合关系代替继承关系,降低抽象和实现两个可变维度的耦合度。

这句话可能不太好理解,请接着往下看。

现实生活中的例子

我们去买饮料,饮料分大、中、小杯,饮料的种类也很多,比如:咖啡、可乐、奶茶等,另外,饮料还能选加冰不加冰等。

上面这个例子,不管我们买什么,它都是最终实现的都是一杯饮料。它都是用杯子来装,都有种类,都可以选择加冰不加冰,这是他们共同的抽象部分。这样抽象的部分就比较好复用。

应用场景

桥接模式的应用场景有以下特点:

  1. 如果产品的部件有独立的变化维度,可以考虑桥接模式;
  2. 不希望使用继承,或因为多层次继承导致系统类的个数急剧增加的系统;
  3. 产品部件的粒度越细,部件复用的必要性越大,可以考虑桥接模式;

优缺点

优点:

  1. 分离了抽象和实现部分,将实现层和抽象层解耦,有利于分层
  2. 提高了可扩展性,多个维度的部件自由组合,避免了类继承带来的强耦合关系,也减少了部件类的数量;
  3. 使用者不用关心细节的实现,可以方便快捷地进行使用;

桥接模式的缺点:

  1. 桥接模式要求两个部件没有耦合关系,否则无法独立地变化,因此要求正确的对系统变化的维度进行识别,使用范围存在局限性;
  2. 桥接模式的引入增加了系统复杂度;

实现

class DrinkType {
    constructor(type) {
        this.type = type;
    }
    drink() {
        return this.type;
    }
}

class Cup {
    constructor(size) {
        this.size = size;
    }
    drink() {
        return this.size;
    }
}

class Ice {
    constructor(ice) {
        this.ice = ice;
    }
    drink() {
        return this.ice;
    } 
}

class ACupOfDrinks {
    constructor(type, ice, size) {
        this.type = type;
        this.ice = ice;
        this.size = size;
    }

    drink() {
        console.log(`${this.size.drink()}${this.type.drink()}${this.ice.drink()}`);
    }
}

const drink = new ACupOfDrinks(new DrinkType('咖啡'), new Ice('不加冰'), new Cup('大杯'));
drink.drink(); // 大杯咖啡不加冰