《設(shè)計(jì)模式》一書對(duì)Bridge是這樣描述的:

          將抽象與其實(shí)現(xiàn)解耦,使它們都可以獨(dú)立地變化。

          大致意思是說(shuō):將一組實(shí)現(xiàn)與另一組使用他們的對(duì)象分離。這里的實(shí)現(xiàn)指的是抽象類及其

          派生類用來(lái)實(shí)現(xiàn)自己的對(duì)象(而不是抽象類的派生類,這些派生類被稱為具體類)。下面

          是《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é)果如下

          使用DP1draw_a_line()畫線

          使用DP1draw_a_line()畫線

          使用DP1draw_a_line()畫線

          使用DP1draw_a_line()畫線

          使用DP2drawCircle()畫圓

          在這個(gè)例子中Shape對(duì)象實(shí)際上是一個(gè)RetangleCircle對(duì)象Client并不知道到底是那個(gè)因?yàn)樗鼈兛雌饋?lái)都一樣。Drawing實(shí)際上是一個(gè)V1DrawingV2Drawing,Shape對(duì)象并知道到底是哪個(gè)因?yàn)樗鼈兛雌饋?lái)都一樣。DP1或DP2使用它的Drawing對(duì)象知道是哪一個(gè)。Shape是事物的抽象,Drawing是實(shí)現(xiàn)或者操作事物方法的抽象。他們兩個(gè)都可以獨(dú)立地變化。正如例子中所說(shuō)那樣,我們可以輸出一個(gè)矩形可以使用V1Drawing也可以使用V2Drawing來(lái)完成,輸出一個(gè)圓形也是一樣都有兩種方法。Bridge模式遵循了設(shè)計(jì)模式中兩條基本策略:找出變化并封裝之和優(yōu)先使用對(duì)象聚集,而不是類繼承。

              小結(jié):Bridge模式是一種抽象與其實(shí)現(xiàn)相分離的模式。它主要應(yīng)用于:當(dāng)事物是一組變化量,和對(duì)這些事物的操作方法(實(shí)現(xiàn))也是一組變化量的情況,也就是說(shuō)它們都是多變的。

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 靖远县| 玛沁县| 太保市| 越西县| 巨鹿县| 会同县| 屏山县| 涪陵区| 龙海市| 盘锦市| 长子县| 鹤壁市| 晋州市| 罗平县| 株洲县| 临江市| 环江| 休宁县| 吴忠市| 江山市| 黑水县| 迁西县| 孙吴县| 田林县| 荃湾区| 敦化市| 琼海市| 蓬安县| 澄江县| 霍城县| 安平县| 凤台县| 商都县| 石城县| 宁城县| 鄯善县| 天峨县| 兰西县| 蒲城县| 海南省| 河东区|