??? 1:代理模式:
          ??? 為其它對象提供一種代理以控制對目標對象的訪問。
          即第三方對象通過訪問代理對象而達到訪問目標對象之目的,與此同時,代理對象在訪問目標對象前后加入特定的邏輯以實現(xiàn)功能的擴展。
          ???? 以靜態(tài)代理為例:
          package?static_proxy;

          public?interface?Movable?{
          ????
          public?void?move();

          }

          package?static_proxy;

          import?java.util.Random;

          public?class?Tank?implements?Movable?{
          ????@Override
          ????
          public?void?move()?{
          ????????System.out.println(
          "?Tank?is?moving??");
          ????????
          try?{
          ????????????Thread.sleep(
          new?Random().nextInt(1000));
          ????????}?
          catch?(InterruptedException?e)?{
          ????????????e.printStackTrace();
          ????????}
          ????}
          }

          package?static_proxy;

          public?class?TankLogProxy?implements?Movable?{
          ????
          private?Movable?obj;
          ????
          public?TankLogProxy(Movable?obj)?{
          ????????
          super();
          ????????
          this.obj?=?obj;
          ????}
          ????@Override
          ????
          public?void?move()?{
          ????????System.out.println(
          "the?log?is?begin??");
          ????????obj.move();
          ????????System.out.println(
          "the?log?is?end??");
          ????}
          }

          package?static_proxy;

          public?class?TankTimeProxy?implements?Movable?{????
          ????
          private?Movable?obj;
          ????
          public?TankTimeProxy(Movable?obj)?{
          ????????
          super();
          ????????
          this.obj?=?obj;
          ????}
          ????@Override
          ????
          public?void?move()?{
          ????????
          long?begintime?=?System.currentTimeMillis();
          ????????System.out.println(
          "?Tank?is?begining?to?move?!");
          ????????obj.move();
          ????????
          long?endtime?=?System.currentTimeMillis();
          ????????System.out.println(
          "?Tank?is?stop?!");
          ????????System.out.println(
          "move?time?:?"+(endtime-begintime));
          ????}
          }

          package?static_proxy;
          public?class?Client?{
          ????
          /**
          ?????*?
          @param?args
          ?????
          */
          ????
          public?static?void?main(String[]?args)?{
          ????????Movable?tankTime?
          =?new?TankTimeProxy(new?Tank());
          ????????Movable?tankLog?
          =?new?TankLogProxy(tankTime);
          ????????tankLog.move();
          ????}
          }

          代理模式:目標對象和代理對象實現(xiàn)同一接口;代理對象訪問目標對象時在其前后加入一定的邏輯實現(xiàn)功能擴展;可多次代理。

          2.裝飾者模式:
          ????

          動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更加靈活。


          package?decorator;

          public?abstract?class?car_parent?{
          ????
          //?汽車抽象父類
          ????private?String?make_address;
          ????
          private?int?speed;

          ????
          public?String?getMake_address()?{
          ????????
          return?make_address;
          ????}

          ????
          public?void?setMake_address(String?make_address)?{
          ????????
          this.make_address?=?make_address;
          ????}

          ????
          public?int?getSpeed()?{
          ????????
          return?speed;
          ????}

          ????
          public?void?setSpeed(int?speed)?{
          ????????
          this.speed?=?speed;
          ????}

          ????
          public?abstract?void?print_face();

          }


          package?decorator;

          public?abstract?class?decorator_parent?extends?car_parent?{
          ????
          //?裝飾者父類
          ????protected?car_parent?car_parent_ref;

          ????
          public?decorator_parent(car_parent?carParentRef)?{
          ????????
          super();
          ????????car_parent_ref?
          =?carParentRef;
          ????}
          ????@Override
          ????
          public?void?print_face()?{
          ????????car_parent_ref.print_face();
          ????}

          }

          package?decorator;
          public?class?decorator_audi_red?extends?decorator_parent?{
          ????
          public?decorator_audi_red(car_parent?carParentRef)?{
          ????????
          super(carParentRef);
          ????}
          ????@Override
          ????
          public?void?print_face()?{
          ????????
          super.print_face();
          ????????System.out.println(
          "給 奧迪 噴涂鴉 - 顏色為 紅色火焰");
          ????}
          }

          package?decorator;
          public?class?decorator_audi_purple?extends?decorator_parent?{

          ????
          public?decorator_audi_purple(car_parent?carParentRef)?{
          ????????
          super(carParentRef);
          ????}
          ????@Override
          ????
          public?void?print_face()?{
          ????????
          super.print_face();
          ????????System.out.println(
          "給 奧迪 噴涂鴉 - 顏色為 紫色霞光");
          ????}
          }

          package?decorator;

          public?class?main_run?{
          ????
          public?static?void?main(String[]?args)?{

          ????????car_parent?audi_sub_ref?
          =?new?audi_sub();
          ????????audi_sub_ref.setMake_address(
          "北京市朝陽區(qū)");
          ????????audi_sub_ref.setSpeed(
          200);
          ????????
          ????????decorator_audi_red?decorator_audi_red_ref?
          =?new?decorator_audi_red(audi_sub_ref);

          ????????decorator_audi_purple?decorator_audi_purple_ref?
          =?new?decorator_audi_purple(decorator_audi_red_ref);
          ????????decorator_audi_purple_ref.print_face();
          ????}
          }

          裝飾者模式:裝飾者和被裝飾者應(yīng)繼承或?qū)崿F(xiàn)同一父類或接口,以表示它們?yōu)橥活悓ο螅ǚ潜仨殻谎b飾者對象對被裝飾者對象增加一定的職責(zé);可多次裝飾。

          可以發(fā)現(xiàn):代理模式和裝飾者模式上在語法形式上幾乎完全一樣,那么它們的區(qū)別在哪里呢?
          裝飾者模式:動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說,裝飾模式相比生成子類更加靈活
          代理模式:為其它對象提供一種代理以控制對這個對象的訪問。


          其實,它們的著重點一個在于“增加”職責(zé),另一個在于“控制”訪問。這是它們最本質(zhì)的區(qū)別。

          由此可以看到:學(xué)習(xí)設(shè)計模式重點在于“語義”上把握,而不是追求它的“形式。

          Feedback

          # re: 胡說八道:代理模式和裝飾者模式的異同點比較  回復(fù)  更多評論   

          2010-09-02 10:21 by bonamana
          其實,它們的著重點一個在于“增加”職責(zé),另一個在于“控制”訪問。這是它們最本質(zhì)的區(qū)別。

          由此可以看到:學(xué)習(xí)設(shè)計模式重點在于“語義”上把握,而不是追求它的“形式

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 岢岚县| 定兴县| 溧水县| 富蕴县| 团风县| 天柱县| 临沧市| 确山县| 长治市| 西乡县| 新密市| 裕民县| 舞钢市| 承德市| 富平县| 绥芬河市| 巴马| 磐安县| 营山县| 黔西| 孝义市| 延津县| 灵山县| 景宁| 阿坝| 海兴县| 昔阳县| 睢宁县| 淮南市| 宁都县| 建宁县| 洪湖市| 竹溪县| 铅山县| 谢通门县| 新和县| 芒康县| 唐山市| 扎鲁特旗| 光泽县| 江西省|