将抽象与其实现解耦,使它们都可以独立地变化。
大致意思是说:将一组实现与另一组使用他们的对象分离。这里的实现指的是抽象类及其
派生类用来实现自己的对象(而不是抽象类的派生类,这些派生类被称为具体类)。下面
是《Design Patterns Explained》书中的例子。其结构图如下:
下面是它的实现:
abstract class Shape{
protected Drawing myDrawing;
abstract public void draw();
Shape(Drawing drawing){
myDrawing=drawing;
}
protected void drawLine(){
myDrawing.drawLine();
}
protected void drawCircle(){
myDrawing.drawCircle();
}
}
class Rectangle extends Shape{
public Rectangle(Drawing darw){
super(darw);
}
public void draw(){
drawLine();
drawLine();
drawLine();
drawLine();
}
}
class Circle extends Shape{
public Circle(Drawing draw){
super(draw);
}
publicvoid draw(){
myDrawing.drawCircle();
}
}
abstract class Drawing{
abstract public void drawLine();
abstract public void drawCircle();
}
class V1Drawing extends Drawing{
public void drawLine(){
DP1.draw_a_line();
}
public void drawCircle(){
DP1.draw_a_circle();
}
}
class V2Drawing extends Drawing{
public void drawLine(){
DP2.drawLine();
}
public void drawCircle(){
DP2.drawCircle();
}
}
class DP1{
public static void draw_a_line(){
System.out.println("使用DP1的draw_a_line()画线");
}
public static void draw_a_circle(){
System.out.println("使用DP1的draw_a_circle()画圆");
}
}
class DP2{
public static void drawLine(){
System.out.println("使用DP2的drawLine()画线");
}
public static void drawCircle(){
System.out.println("使用DP2的drawCircle()画圆");
}
}
public class BridgeClient {
public static void main(String[] args) {
Drawing draw1=new V1Drawing();
Drawing draw2=new V2Drawing();
Shape shape1=new Rectangle(draw1);
shape1.draw();
Shape shape2=new Circle(draw2);
shape2.draw();
}
}
输出结果如下:
使用DP1的draw_a_line()画线
使用DP1的draw_a_line()画线
使用DP1的draw_a_line()画线
使用DP1的draw_a_line()画线
使用DP2的drawCircle()画圆
在这个例子中Shape对象实际上是一个Retangle或Circle对象,但Client并不知道到底是那个,因为它们看起来都一样。Drawing实际上是一个V1Drawing或V2Drawing,但Shape对象并知道到底是哪个,因为它们看起来都一样。DP1或DP2使用它的Drawing对象知道是哪一个。Shape是事物的抽象,Drawing是实现或者操作事物方法的抽象。他们两个都可以独立地变化。正如例子中所说那样,我们可以输出一个矩形可以使用V1Drawing也可以使用V2Drawing来完成,输出一个圆形也是一样都有两种方法。Bridge模式遵循了设计模式中两条基本策略:找出变化并封装之和优先使用对象聚集,而不是类继承。
小结:Bridge模式是一种抽象与其实现相分离的模式。它主要应用于:当事物是一组变化量,和对这些事物的操作方法(实现)也是一组变化量的情况,也就是说它们都是多变的。