基本概念
桥接模式(Bridge Pattern)又称桥梁模式,将抽象部分与它的实现部分分离,使它们都可以独立地变化。使用组合关系代替继承关系,降低抽象和实现两个可变维度的耦合度。
这句话可能不太好理解,请接着往下看。
现实生活中的例子
我们去买饮料,饮料分大、中、小杯,饮料的种类也很多,比如:咖啡、可乐、奶茶等,另外,饮料还能选加冰不加冰等。
上面这个例子,不管我们买什么,它都是最终实现的都是一杯饮料。它都是用杯子来装,都有种类,都可以选择加冰不加冰,这是他们共同的抽象部分。这样抽象的部分就比较好复用。
应用场景
桥接模式的应用场景有以下特点:
- 如果产品的部件有独立的变化维度,可以考虑桥接模式;
- 不希望使用继承,或因为多层次继承导致系统类的个数急剧增加的系统;
- 产品部件的粒度越细,部件复用的必要性越大,可以考虑桥接模式;
优缺点
优点:
- 分离了抽象和实现部分,将实现层和抽象层解耦,有利于分层;
- 提高了可扩展性,多个维度的部件自由组合,避免了类继承带来的强耦合关系,也减少了部件类的数量;
- 使用者不用关心细节的实现,可以方便快捷地进行使用;
桥接模式的缺点:
- 桥接模式要求两个部件没有耦合关系,否则无法独立地变化,因此要求正确的对系统变化的维度进行识别,使用范围存在局限性;
- 桥接模式的引入增加了系统复杂度;
实现
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(); // 大杯咖啡不加冰