將抽象化與實現化脫耦,使得二者可以獨立變化。該模式的目標是通過把高層的抽象和底層的實現分開,分別構建自己的類層次結構,並通過實現部分的接口將兩部分進行橋接,從而達到高層抽象和底層實現可以獨立的方便擴展的目的。其核心是分離,和委託。
在以下的情況下應當使用橋樑模式:
如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的聯繫。
設計要求實現角色的任何改變不應當影響客戶端,或者說實現化角色的改變對客戶端是完全透明的。
一個構件有多於一個的抽象化角色和實現化角色,系統需要他們之間進行動態耦合。
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();
}
}