23种设计模式之桥接设计模式
目录
- 1. 简介
- 2. 代码
- 2.1 Shape (抽象化角色)
- 2.2 Circle (扩展抽象化角色)
- 2.3 Square (扩展抽象化角色)
- 2.4 Tools (实现化角色)
- 2.5 Pencil (具体实现化角色)
- 2.6 Pen (具体实现化角色)
- 2.7 Test (测试类)
- 3. 使用场景
- 4. 优缺点
- 5. 总结
1. 简介
桥接模式是一种结构型设计模式。它将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式通过使用组合 / 聚合关系而不是继承关系来实现抽象和实现部分的解耦。
例如,假设我们有一个图形绘制系统,它可以绘制不同颜色和不同形状的图形。如果使用继承,对于每种颜色和形状的组合都需要创建一个新的子类(如红色圆形类、蓝色方形类等),这样会导致类的数量急剧膨胀。而桥接模式可以把形状和颜色这两个维度分开处理,形状是抽象部分,颜色是实现部分,它们通过桥接的方式组合在一起,从而减少了类的数量并增加了灵活性。
- 结构组成
- 抽象化(Abstraction)角色
它定义了抽象类的接口,通常包含一个对实现化对象的引用。它可以是抽象类也可以是接口。
以图形绘制为例,抽象图形类(如Shape)就是抽象化角色,它有一个方法(如draw())用于绘制图形,并且包含一个对颜色对象的引用。 - 扩展抽象化(Refined Abstraction)角色
它是抽象化角色的子类,实现了在抽象化中定义的接口。
比如Circle(圆形)、Square(方形)等具体图形类就是扩展抽象化角色。它们继承自Shape类,重写draw()方法,在其中结合自身形状特点和颜色来进行图形绘制。 - 实现化(Implementor)角色
它定义了实现化角色的接口,这个接口不一定要与抽象化角色的接口完全一致。
在图形例子中,颜色接口(如Color)就是实现化角色,它有一个方法(如applyColor())用于应用颜色。 - 具体实现化(Concrete Implementor)角色
它是实现化角色的具体实现类。
例如RedColor(红色)、BlueColor(蓝色)等具体颜色类就是具体实现化角色,它们实现了Color接口的applyColor()方法,用于确定如何将特定颜色应用到图形上。
- 抽象化(Abstraction)角色
2. 代码
2.1 Shape (抽象化角色)
public interface Shape {
public void draw(String tools);
}
2.2 Circle (扩展抽象化角色)
public class Circle implements Shape{
@Override
public void draw(String tools) {
System.out.println("使用工具:"+ tools +"--Drawing circle");
}
}
2.3 Square (扩展抽象化角色)
public class Square implements Shape{
@Override
public void draw(String tools) {
System.out.println("使用工具:"+ tools +"--Drawing square");
}
}
2.4 Tools (实现化角色)
public abstract class Tools {
public Tools(Shape shape){
}
public abstract void use();
}
2.5 Pencil (具体实现化角色)
public class Pencil extends Tools{
private Shape shape;
public Pencil(Shape shape) {
super(shape);
this.shape = shape;
}
@Override
public void use() {
shape.draw("Pencil");
}
}
2.6 Pen (具体实现化角色)
public class Pen extends Tools{
private Shape shape;
public Pen(Shape shape) {
super(shape);
this.shape = shape;
}
@Override
public void use() {
shape.draw("pen");
}
}
2.7 Test (测试类)
public class Test {
public static void main(String[] args) {
Tools pen = new Pen(new Circle());
pen.use();
Shape square = new Square();
Tools pencil = new Pencil(square);
pencil.use();
}
}
运行结果:
使用工具:penDrawing circle
使用工具:PencilDrawing square
3. 使用场景
- 当一个类存在两个独立变化的维度时
例如汽车品牌和汽车的能源类型(汽油、电动等)。品牌是一个维度,能源类型是另一个维度。使用桥接模式可以避免为每个品牌 - 能源类型组合创建一个单独的类。 - 需要在抽象化和实现化之间增加更多灵活性的时候
比如在图形用户界面(GUI)库中,窗口的抽象概念和窗口的具体实现(不同操作系统下的窗口实现)可以使用桥接模式。这样可以方便地在不同操作系统(如 Windows、Linux 等)上实现相同的窗口抽象功能,并且可以独立地对窗口抽象和操作系统相关的实现进行修改。
4. 优缺点
- 优点
- 分离抽象和实现:使得抽象部分和实现部分可以独立地扩展和修改,提高了系统的可维护性和可扩展性。
- 提高可组合性:可以方便地组合不同的抽象和实现,产生多种变化。
- 符合开闭原则:在增加新的抽象或者实现时,不需要修改原有的代码,只需要实现新的类。
- 缺点
- 增加了系统的复杂度:因为引入了更多的类和对象间的关联关系,对于初学者来说可能比较难理解和设计。
- 需要正确地识别抽象和实现部分:如果划分不当,可能无法充分发挥桥接模式的优势,甚至会使代码变得更加混乱。
5. 总结
使用一个抽象类来当接口,再来几个实现类。