场景
设想要绘制一幅图画,蓝天、白云、绿树、小鸟,画面尺寸很大.
1.用蜡笔绘制—-假设,一套12种颜色的蜡笔,尺寸要大,中,小.这样,总共需要 12*3=36 支蜡笔。
2.用毛笔绘制—-同样的效果,一套水彩12色,外加3只 大,中,小的毛笔.总共需要 12 + 3 = 15
这里,为了一幅画,我们需要准备36支型号不同的蜡笔,而改用毛笔三支就够了,当然还要搭配上12种颜料。
通过Bridge模式,我们把乘法运算3×12=36改为了加法运算3+12=15,这一改进可不小!
意图
将抽象化(Abstraction)与实现化(( Implementation)脱藕,使得二者可以独立地变化.
在这里,蜡笔由于无法将笔与颜色分离,造成笔与颜色两个自由度无法单独变化,使得只有创建36种对象才能完成任务。
而毛笔与颜料能够很好的脱锅,各自独立变化,便简化了操作.
Bridge模式将继承关系转换为组合关系,从而降低了系统间的藕合,减少了代码编写量。
但这仅仅是Bridgc模式带来的众多好处的一部分,当然还有更多层面的内容。
思想
在开发过程中大家通常会遇到一个对象有两个变化的维度,而且这两个维
度变化地非常巨烈,这种变化导致了纵横交错的结果,使对象的设计变得困难,并且在
对象数量上和可扩展性上都带来了很大的麻烦。此时我们应当把这两个变化比较巨烈的
维度拆离,然后用组合的方式把它们结合在一起。这就是桥接器摸式的思想。
应用场景
1、如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
2、设计要求实现化角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
3、一个构件有多于一个的抽象化角色和实现化角色,系统需要它们之间进行动态藕合。
虽然在系统中使用继承是没有问题的,但是由于抽象化角色和具体化角色需要独立变化,设计要求需要独立管理这两者。
桥梁模式是一个非常有用的模式,也非常复杂,它很好的符合了开放一封闭原则和优先使用对象,
而不是继承这两个面向对象原则.
UML图
1.一般的蜡笔的继承模式。
2.毛笔的桥接模式
应用实例
1.建立一个抽象的画笔类:包含水色属性和着色方法.
public abstract class Brush {
public Color color;
public abstract void Paint();
public void SetColor(Color color) {
this.color = color;
}
}
2.建立两个大小毛笔类,实现画笔的着色方法,输出绘制的水色.
public class BigBrush extends Brush {
@Override
public void Paint() {
System.out.println("Using big brush and color is " + color.paintcolor);
}
}
public class SmallBrush extends Brush {
@Override
public void Paint() {
System.out.println("Using small brush and color is " + color.paintcolor);
}
}
3.包含水色属性的颜色类.
public abstract class Color {
public String paintcolor;
}
4.各种颜色的实现(这里仅列举 红,绿,蓝 三种颜色).
public class Red extends Color {
public Red() {
this.paintcolor = "red";
}
}
public class Blue extends Color {
public Blue() {
this.paintcolor = "blue";
}
}
public class Green extends Color {
public Green() {
this.paintcolor = "green";
}
}
优点
1、分离接口及其实现部分,这里实现了Abstraction和Implementor的分离,有助于降低对实现部分的依赖性,从而产生更好的结构化系统。
2、提高了可扩充性,可以独立的对Abstraction和Implementor,层次结构进行扩充。