設(shè)計(jì)模式學(xué)習(xí)筆記(四)—Bridge橋接模式
Posted on 2007-11-28 15:48 flustar 閱讀(1209) 評論(0) 編輯 收藏 所屬分類: Design Patterns《設(shè)計(jì)模式》一書對Bridge是這樣描述的:
將抽象與其實(shí)現(xiàn)解耦,使它們都可以獨(dú)立地變化。
大致意思是說:將一組實(shí)現(xiàn)與另一組使用他們的對象分離。這里的實(shí)現(xiàn)指的是抽象類及其
派生類用來實(shí)現(xiàn)自己的對象(而不是抽象類的派生類,這些派生類被稱為具體類)。下面
是《Design Patterns Explained》書中的例子。其結(jié)構(gòu)圖如下:
下面是它的實(shí)現(xiàn):
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();
}
}
輸出結(jié)果如下:
使用DP1的draw_a_line()畫線
使用DP1的draw_a_line()畫線
使用DP1的draw_a_line()畫線
使用DP1的draw_a_line()畫線
使用DP2的drawCircle()畫圓
在這個(gè)例子中Shape對象實(shí)際上是一個(gè)Retangle或Circle對象,但Client并不知道到底是那個(gè),因?yàn)樗鼈兛雌饋矶家粯印?/span>Drawing實(shí)際上是一個(gè)V1Drawing或V2Drawing,但Shape對象并知道到底是哪個(gè),因?yàn)樗鼈兛雌饋矶家粯印P1或DP2使用它的Drawing對象知道是哪一個(gè)。Shape是事物的抽象,Drawing是實(shí)現(xiàn)或者操作事物方法的抽象。他們兩個(gè)都可以獨(dú)立地變化。正如例子中所說那樣,我們可以輸出一個(gè)矩形可以使用V1Drawing也可以使用V2Drawing來完成,輸出一個(gè)圓形也是一樣都有兩種方法。Bridge模式遵循了設(shè)計(jì)模式中兩條基本策略:找出變化并封裝之和優(yōu)先使用對象聚集,而不是類繼承。
小結(jié):Bridge模式是一種抽象與其實(shí)現(xiàn)相分離的模式。它主要應(yīng)用于:當(dāng)事物是一組變化量,和對這些事物的操作方法(實(shí)現(xiàn))也是一組變化量的情況,也就是說它們都是多變的。