桥接模式(Bridge Pattern)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。
它通过组合的方式,而不是继承的方式,将抽象和实现的部分连接起来。
将抽象和实现分离,是它们可以独立变化。它是用组合关系替代继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合。
举个例子:
现在有如下需求,需要创建不同的图形,并且每个图形有不同的形状,也可能会有不同的颜色,如果我们采用继承的方式来实现这个需求,如下图所示:
其实我们可以发现,利用这种继承模式来实现,类似于一个线性继承结构,如果说有 x 种形状,y 种颜色,那么我们最多会有 x * y 个子类,这样的话,非常容易产生子类爆炸的情况,拓展起来非常不灵活。
在这个需求中,有多个不同的维度(形状、颜色),为了设计更加灵活的系统,我们此时考虑桥接模式,用组合关系替代继承关系。
我们完善上述 图形 的案例。
Shape - 抽象化角色(Abstraction)
Circle、Rectangle - 拓展抽象化角色(Refined Abstraction)
Color - 实现化角色(Implementor)
Red、Blue、Green - 具体实现化角色(Concrete Implementor)
public abstract class Shape {
private Color color;
public Shape(Color color) {
this.color = color;
}
public abstract void getDesc();
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
}
public class Circle extends Shape{
public Circle(Color color) {
super(color);
}
@Override
public void getDesc() {
System.out.println("This is " + super.getColor().getColor() + " Circle");
}
}
public class Rectangle extends Shape{
public Rectangle(Color color) {
super(color);
}
@Override
public void getDesc() {
System.out.println("This is " + super.getColor().getColor() + " Rectangle");
}
}
public interface Color {
String getColor();
}
public class Red implements Color{
@Override
public String getColor() {
return "Red";
}
}
public class Blue implements Color{
@Override
public String getColor() {
return "Blue";
}
}
public class Green implements Color{
@Override
public String getColor() {
return "Green";
}
}
public class Main {
public static void main(String[] args) {
Color color = new Red();
Shape shape = new Circle(color);
shape.getDesc();
color = new Blue();
shape = new Circle(color);
shape.getDesc();
shape = new Rectangle(color);
shape.getDesc();
}
}
具体使用场景: