桥接模式解决的问题:
当一个对象拥有两个描述维度时,如果只通过继承的方式描述这个对象,需要建立大量的对象,例如:
定义两个接口描述一个图形:
public interface Shape {
void drawShape();
}
public interface Color {
void drawColor();
}
一个图形可能有m种形状和n种颜色,那么想要描述所有的图形,就要建立m*n个类,直观地有两种实现方式:
1.直接实现两个接口:
public class RedCircle implements Shape, Color {
public void drawShape() {
print("circle");
}
public void drawColor() {
print("RedColor");
}
}
这种方式的优点是,Shape和Color两个接口相互独立没有耦合
;
这种方式的缺点是,如果要实现RedCircle和BlackCircle两个类,虽然它们都是Circle,但是Circle类drawShape的逻辑无法复用
,只能多次复制drawShape的逻辑,为了实现逻辑复用,考虑使用树型结构定义类:
2.通过树形结构描述:
public class Circle implements Shape {
public void drawShape() {
print("circle");
}
}
public class RedCircle extends Circle implements Color {
public void drawColor() {
drawShape();
print("RedColor");
}
}
这样实现的优点是,Circle类drawShape的逻辑可以复用
;
缺点是,Shape和Color接口耦合
在了一起,为了实现一个RedSquare,还需要新建Square类和RedSquare类,非常不便
桥接模式:
桥接模式的思想是,用关联代替继承
,去实现一个维度的变化,这样显然降低了耦合,同时还减少了class的种类,以上述图形的为例,描述m种形状和n种颜色的所有图形,只需要m+n个类就可以完成,还是以Shape和Color接口为例:
public class Circle implements Shape {
Color color;
public void setColor(Color color) {
this.color = color; //松耦合,把实现的关系转化为关联关系
}
public void drawShape() {
color.drawColor();
print("circle");
}
}
如果想要实现一个RedSquare,只需要重新定义一个Square类,然后:
public static void main(String[] args) {
//实现RedCircle:
Circle circle = new Circle();
circle.setColor(new Red());
circle.drawShape();
//实现RedSquare:
Square square = new Square();
square.setColor(new Red());
square.drawShape();
}
这样使用桥接模式,既松动了耦合
,又实现了复用
,还减少了类型
,用m+n个类实现了m*n种组合