设计模式—桥接模式
一、什么是桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,通过将抽象部分与实现部分分离,使二者可以独立变化。它使用组合关系代替继承关系,避免因多层继承导致的类爆炸问题。
通过桥接模式,可以在运行时动态地给一个抽象化的对象设置不同的实现化对象,这样就能够在不改动代码的情况下增加新的实现或者改变现有的实现。
二、结构组成
抽象(Abstraction):定义抽象接口,通常包含对实现接口的引用。
扩展抽象(Refined Abstraction):对抽象的扩展,可以是抽象类的子类或具体实现类。
实现(Implementor):定义实现接口,提供基本操作的接口,不关心具体逻辑。
具体实现(Concrete Implementor):实现实现接口的具体类。
三、应用场景
使用目的:
桥接模式的一个常用场景就是为了替换继承。我们知道继承有很多优点,比如抽象,封装,多态等,父类封装共性,子类实现特性。继承可以很好地帮助我们实现代码复用(封装)的功能,但是同时,这也是继承的一大缺点。因为父类拥有的方法,子类也会继承得到,无论子类是否需要。这说明了继承具备强侵入性(父类代码侵入子类),同时会导致子类臃肿。因此,在设计模式中,有一个原则为,优先使用组合/聚合的方式,而不是继承。
使用场景:
抽象和实现分离:当你希望将一个系统的抽象化与其实现细节分离,使它们可以独立变化时。例如,在图形界面设计中,你可能想要将图形的形状(如矩形、圆形)与绘制这些形状的具体平台(如Windows、macOS)分离,这样就可以在不修改图形代码的情况下添加新的平台支持。
实现细节透明化:当你希望对客户隐藏实现细节,让客户仅关心抽象层次的操作时。桥接模式允许客户只与抽象类交互,而不直接与实现类打交道。
多维度分类的系统:当一个系统中的对象可以按照多个维度进行分类,而这些维度之间的组合会产生大量的子类时,可以使用桥接模式来减少子类的数量。例如,一个汽车系统可以按颜色(红色、蓝色)和型号(轿车、SUV)分类,如果不使用桥接模式,就需要为每种组合创建一个子类。
四、实现
// 实现层:颜色维度
interface Color {
applyColor(): string;
}
class Red implements Color {
applyColor() { return "红色" }
}
class Blue implements Color {
applyColor() { return "蓝色" }
}
// 抽象层:车型维度
abstract class CarType {
constructor(protected color: Color) {}
abstract produce(): void;
}
class Sedan extends CarType {
produce() {
console.log(`生产${this.color.applyColor()}轿车`);
}
}
class SUV extends CarType {
produce() {
console.log(`生产${this.color.applyColor()}SUV`);
}
}
// 组合使用
const redSedan = new Sedan(new Red());
redSedan.produce(); // 输出:生产红色轿车
const blueSUV = new SUV(new Blue());
blueSUV.produce(); // 输出:生产蓝色SUV
本人水平有限,有错的地方还请批评指正。
什么是精神内耗?
简单地说,就是心理戏太多,自己消耗自己。
所谓:
言未出,结局已演千百遍;
身未动,心中已过万重山;
行未果,假想灾难愁不展;
事已闭,过往仍在脑中演。