1.桥接模式概述
将抽象和实现分离,使它们可以独立的变化,实际上是使用组合关系来代替继承关系,将抽象和实现两个方向上的耦合降低。
桥接模式的主要角色有:
- 抽象化角色:定义抽象化,并且包含一个对实现化对象的引用。
- 扩展抽象化:是抽象化角色的子类,实现了业务方法。
- 实现化对象:定义接口,供子类使用
- 具体实现化对象:给出实现化对象的方法实现
试想这样一个场景,我们需要开发一个画图程序,要求能画各种形状,各种颜色的图形。按照传统的想法,应该定义一个Shape接口,在此基础上实现Rectengle,Circle,Triangle,然后再衍生出RedCircle,GreenCicle等等。这样一来每当有一个新图形增加时,就需要在形状和颜色两个方面同时扩展。产生类爆炸,遵循桥接模式的思想,我们可以画出如下的UML类图。
- Shape:对应抽象化角色
- Circle和Rectengle:对应具体化角色
- Color:实现化对象
- Green和Red:具体化对象
public abstract class Shape {
protected Color color;
public abstract void draw();
}
public class Circle extends Shape{
public void setColor(Color color){
this.color=color;
}
@Override
public void draw() {
System.out.println("画圆形");
color.fillColor();
}
}
public class Rectengle extends Shape{
@Override
public void draw() {
System.out.println("画矩形");
color.fillColor();
}
public void setColor(Color color){
this.color=color;
}
}
public interface Color {
public void fillColor();
}
public class Green implements Color{
@Override
public void fillColor() {
System.out.println("用绿色填充!");
}
}
public class Red implements Color{
@Override
public void fillColor() {
System.out.println("用红色填充!");
}
}
客户端测试:
public class Client {
public static void main(String[] args) {
Circle circle=new Circle();
Color color=new Green();
circle.setColor(color);
circle.draw();
color=new Red();
circle.setColor(color);
circle.draw();
//
画圆形
用绿色填充!
画圆形
用红色填充!
}
}
使用场景: 1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。 2、对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。 3、一个类存在两个独立变化的维度,且这两个维度都需要进行扩展。