桥接模式
桥接模式属于结构型模式的一种。
桥接模式的定义颇为玄乎。其主要目的是将抽象部分与实现部分分离,使它们可以独立变化。简单地来说,桥接模式通过引入一个抽象层和具体实现层之间的桥梁,来减少二者之间的耦合度。
桥接模式是为了避免直接继承带来的子类爆炸。
桥接模式通过分离一个抽象接口和它的实现部分,使得设计可以按两个维度进行独立扩展。
在某些场景下,当类的数量成对数增加,导致系统变得复杂时,使用桥接模式可以减少类的数量。
在现实生活中类比,挂式空调与空调遥控器。如果将空调开关,调温度等操作都放在空调上,会麻烦很多。将空调与遥控器分开,如果发现遥控器有问题,只需修遥控器就好了,不用去拆空调了。
桥接模式可以将庞杂类拆分为几个类层次结构,这样,修改任意一个类层次结构,不会影响到其他类层次结构。
桥接模式通常有以下组成部分:
- 抽象类:定义了高层接口,持有一个对实现部分的引用。这个抽象类通常提供一些操作,调用实现类的方法。
- 扩展抽象类:是抽象类的具体子类,扩展了抽象类的功能。可以有多个不同的实现,通过组合不同的实现和扩展来满足需求。
- 实现接口:定义了实现部分的接口,通常不需要与抽象类相同,可以与抽象类相对独立,关注具体的实现。
- 具体实现类:实现了实现接口的具体类,负责提供具体的功能和逻辑。
使用桥接模式体现图形库中使用不同颜色绘制不同的形状。
1、实现类接口
// 实现类接口
interface Color {
String fill();
}
2、具体实现类
// 具体实现类
class Red implements Color {
public String fill() {
return "Red";
}
}
class Blue implements Color {
public String fill() {
return "Blue";
}
}
3、抽象类
// 抽象类
abstract class Shape {
protected Color color;
protected Shape(Color color) {
this.color = color;
}
abstract void draw();
}
4、扩展抽象类
// 扩展抽象类
class Circle extends Shape {
public Circle(Color color) {
super(color);
}
public void draw() {
System.out.println("Drawing a Circle in " + color.fill());
}
}
class Square extends Shape {
public Square(Color color) {
super(color);
}
public void draw() {
System.out.println("Drawing a Square in " + color.fill());
}
}
5、客户端
// 客户端
public class Main {
public static void main(String[] args) {
Shape redCircle = new Circle(new Red());
Shape blueSquare = new Square(new Blue());
redCircle.draw(); // 输出: Drawing a Circle in Red
blueSquare.draw(); // 输出: Drawing a Square in Blue
}
}
桥接模式的优缺点。
优点:
- 解耦:桥接模式将抽象和实现分开,便于独立扩展。
- 提高灵活性:增加新的实现或抽象类时,不会影响现有的代码。
- 避免类爆炸:通过组合,避免创建大量的子类,减少了系统的复杂性。
- 抽象部分专注于处理高层逻辑,实现部分处理平台细节。
缺点:
- 增加复杂性:引入了额外的接口和类,初期可能增加理解和实现的难度。
- 不适合简单场景:如果系统结构简单,使用桥接模式可能会显得过于复杂。
桥接模式提供的设计思想值得借鉴,不要过度使用继承,而是优先拆分某些部件,使用组合的方式来扩展功能。
桥接模式适用于那些需要在多个维度上灵活扩展的场景。对于开发大型应用时,桥接模式大有裨益。
设计模式不但是一种对类进行组织的方式,还能用于沟通意图和解决问题。
深渊不会因为你的恐惧而消失。-- 烟沙九洲