将抽象化与实现化脱耦,使得二者可以独立变化。该模式的目标是通过把高层的抽象和底层的实现分开,分别构建自己的类层次结构,并通过实现部分的接口将两部分进行桥接,从而达到高层抽象和底层实现可以独立的方便扩展的目的。其核心是分离,和委托。
在以下的情况下应当使用桥梁模式:
如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的联系。
设计要求实现角色的任何改变不应当影响客户端,或者说实现化角色的改变对客户端是完全透明的。
一个构件有多于一个的抽象化角色和实现化角色,系统需要他们之间进行动态耦合。
public class Point { private int coordinateX; private int coordinateY; public Point(int coordinateX, int coordinateY) { this.coordinateX = coordinateX; this.coordinateY = coordinateY; } @Override public String toString(){ return "Point[x=" + coordinateX + ",y=" + coordinateY + "]"; } }
public interface Draw { public void drawLine(Point startPoint, Point toPoint); }
/** * Unix */ public class UnixDrawImpl implements Draw { public void drawLine(Point startPoint, Point toPoint) { System.out.println("Unix drawLine " + startPoint + "," + toPoint); } }
/** * Win */ public class WinDrawImpl implements Draw{ public void drawLine(Point startPoint, Point toPoint) { System.out.println("Win drawLine " + startPoint + "," + toPoint); } }
/** * 形状 */ public abstract class Shape { protected Draw draw; public Shape(Draw draw) { this.draw = draw; } public abstract void drawShape(); }
/** * 正方形 */ public class Square extends Shape { public Square(Draw draw) { super(draw); } @Override public void drawShape() { draw.drawLine(new Point(0,0), new Point(10,0)); draw.drawLine(new Point(0,0), new Point(0,10)); draw.drawLine(new Point(0,10), new Point(10,10)); draw.drawLine(new Point(10,0), new Point(10,10)); } }
/** *三角形 */ public class Triangle extends Shape { public Triangle(Draw draw) { super(draw); } @Override public void drawShape() { draw.drawLine(new Point(0,0), new Point(10,0)); draw.drawLine(new Point(0,0), new Point(5,10)); draw.drawLine(new Point(5,10), new Point(10,0)); } }
public class Client { public static void main(String[] args) { Draw winDraw = new WinDrawImpl(); Draw unixDraw = new UnixDrawImpl(); //Win绘制正方形 System.out.println("Win绘制正方形"); Shape winSquare = new Square(winDraw); winSquare.drawShape(); //Unix绘制正方形 System.out.println("Unix绘制正方形"); Shape unixSquare = new Square(unixDraw); unixSquare.drawShape(); //Win绘制三角形 System.out.println("Win绘制三角形"); Shape winTriangle = new Triangle(winDraw); winTriangle.drawShape(); //Unix绘制三角形 System.out.println("Unix绘制三角形"); Shape unixTriangle = new Triangle(unixDraw); unixTriangle.drawShape(); } }