Java中的桥接模式(Bridge Pattern)是一种非常有用的结构型设计模式,它旨在将抽象与实现解耦,使得它们可以独立地变化。这种模式通常被用在当一个类存在两个或多个独立变化的维度,并且这些变化维度需要在类的层次结构中分离开来时。
场景描述
假设我们正在开发一个汽车管理系统,其中汽车有不同的品牌和不同的颜色。如果我们直接将品牌和颜色信息嵌入到每个具体的汽车类中,那么每当需要添加新的品牌或颜色时,都需要修改大量的类。这显然不是一个好的设计,因为它违反了开闭原则(对扩展开放,对修改关闭)。
为了解决这个问题,我们可以使用桥接模式。我们可以将“品牌”和“颜色”这两个变化维度分离开来。品牌是一个抽象化的概念,而颜色则是这个品牌下的具体实现。我们可以定义一个品牌接口(或抽象类),并在其中声明一个指向颜色对象的引用。然后,为每个品牌创建一个具体的实现类,并为每个颜色创建一个具体的实现类。
Java实现
- 定义颜色的接口(这是变化的实现部分):
public interface Color {
void fill();
}
// 具体的颜色实现
public class Red implements Color {
@Override
public void fill() {
System.out.println("Filling with red color.");
}
}
public class Blue implements Color {
@Override
public void fill() {
System.out.println("Filling with blue color.");
}
}
- 定义品牌的抽象类(包含对颜色接口的引用,这是桥梁):
public abstract class CarBrand {
protected Color color;
public CarBrand(Color color) {
this.color = color;
}
// 让子类去实现具体的制造过程
public abstract void make();
// 提供一个设置颜色的方法,用于动态改变颜色
public void setColor(Color color) {
this.color = color;
}
// 一个公共方法,展示如何绘制汽车
public void draw() {
color.fill();
make();
}
}
// 具体的品牌实现
public class Toyota extends CarBrand {
public Toyota(Color color) {
super(color);
}
@Override
public void make() {
System.out.println("Making a Toyota car.");
}
}
public class BMW extends CarBrand {
public BMW(Color color) {
super(color);
}
@Override
public void make() {
System.out.println("Making a BMW car.");
}
}
- 客户端代码:
public class BridgePatternDemo {
public static void main(String[] args) {
Toyota toyotaRed = new Toyota(new Red());
toyotaRed.draw(); // 输出:Filling with red color. Making a Toyota car.
Toyota toyotaBlue = new Toyota(new Blue());
toyotaBlue.draw(); // 输出:Filling with blue color. Making a Toyota car.
BMW bmwRed = new BMW(new Red());
bmwRed.draw(); // 输出:Filling with red color. Making a BMW car.
}
}
在这个场景中,Color
接口定义了颜色相关的操作,而CarBrand
抽象类定义了品牌相关的操作,并通过Color
类型的color
属性作为桥梁来连接颜色与品牌。具体的颜色和品牌类分别实现了Color
接口和继承自CarBrand
抽象类。客户端可以根据需要组合不同的品牌和颜色,而无需修改现有的类结构。这就是桥接模式的力量所在,它允许我们在不修改代码结构的情况下,轻松地扩展和改变系统的行为。