设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色、绿色、蓝色等,此时至少有如下两种设计方案:
第一种方案是为每一种形状都提供一套各种颜色的版本
第二种方案是根据实际的需要对形状和颜色进行组合
对于有两个变化维度(即两个变化的原因)的系统,采用方案二来进行设计系统中类的个数更少,且系统扩展更为方便。设计方案二即是桥接模式的应用。桥接模式将继承关系转换为关联关系,从而降低了类与类之间的耦合,减少了代码编写量。
模式的定义
桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。
模式的类图
桥接模式的代码说明
抽象部分:
public abstract class Shape {
private ShapeColor shapeColor;
public Shape(ShapeColor color) {
this.shapeColor = color;
}
public abstract String getShapeName();
@Override
public String toString() {
return "我的形状是:" +this.getShapeName() + ", 我的颜色是:" + this.shapeColor.getColor();
}
}
public class Cycle extends Shape {
public Cycle(ShapeColor color) {
super(color);
}
@Override
public String getShapeName() {
return "圆形";
}
}
public class Square extends Shape {
public Square(ShapeColor color) {
super(color);
}
@Override
public String getShapeName() {
return "正方形";
}
}
public class Triangle extends Shape {
public Triangle(ShapeColor color) {
super(color);
}
@Override
public String getShapeName() {
return "三角形";
}
}
实现部分:
public abstract class ShapeColor {
public abstract String getColor();
}
public class Bule extends ShapeColor {
@Override
public String getColor() {
return "蓝色";
}
}
public class Red extends ShapeColor {
@Override
public String getColor() {
return "红色";
}
}
public class Yellow extends ShapeColor {
@Override
public String getColor() {
return "黄色";
}
}
客户端:
public class Client {
public static void main(String[] args) {
ShapeColor yellow = new Yellow();
ShapeColor red = new Red();
Shape yellowCycle = new Cycle(yellow);
Shape redCycle = new Cycle(red);
Shape yellowSquire = new Square(yellow);
Shape redSquire = new Square(red);
System.out.println(yellowCycle);
System.out.println(redCycle);
System.out.println(yellowSquire);
System.out.println(redSquire);
}
}
抽象部分的类继承体系,顶层是Shape抽象类,Shape的实现类可以有很多,圆形,三角形,正方形,菱形,还可以随意扩展出来非常多的形状
实现部分的类继承体系表示的是Shape的颜色,可有多重颜色,根据自己的需要,还可以扩展出来更多的颜色
抽象部分和实现部分两者是可以独立扩展的,两者之间的关系是组合的关系,实现部分作为一个属性,集成到抽象部分的类中去,这是两个体系发生联系的地方,表现在类图上,就是两个互相独立演化的部分,中间用一条线连起来,这条线看起来就像是一座桥,这个模式就叫做桥接模式
应用的场景
系统有两个独立的变化维度,而这两个维度都需要进行扩展
想要防止因为多层次的继承导致类数量的膨胀
抽象化角色和实现化角色可以以继承的方式独立扩展而互不影响,在程序运行时可以动态将一个抽象化子类的对象和一个实现化子类的对象进行组合,即系统需要对抽象化角色和实现化角色进行动态耦合