国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

java設計模式之裝飾模式詳細介紹

2019-11-26 15:50:09
字體:
來源:轉載
供稿:網友

1.    裝飾模式(Decorator)的定義:又名包裝(Wrapper)模式,裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關系的一個替代方案。

2.    裝飾模式以對客戶端透明的方式動態的給一個對象附加上更多的責任。換言之客戶端并不會覺的對象在裝飾前和裝飾后有什么區別。

3.    裝飾模式可以在不創造更多的子類的模式下,將對象的功能加以擴展。

4.    裝飾模式與類繼承的區別:

1)    裝飾模式是一種動態行為,對已經存在類進行隨意組合,而類的繼承是一種靜態的行為,一個類定義成什么樣的,該類的對象便具有什么樣的功能,無法動態的改變。

2)    裝飾模式擴展的是對象的功能,不需要增加類的數量,而類繼承擴展是類的功能,在繼承的關系中,如果我們想增加一個對象的功能,我們只能通過繼承關系,在子類中增加兩個方法。

3)    裝飾與繼承比較圖:

4)    裝飾模式是在不改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能,它是通過創建一個包裝對象,也就是裝飾來包裹真是的對象。

5.    裝飾模式把對客戶端的調用委派給被裝飾的類,裝飾模式的關鍵在于這種擴展完全透明的。

6.    裝飾模式的構成:

1)    抽象構建角色(Component):給出一個抽象的接口,以規范準備接受附加責任的對象。相當于i/o流里面InputStream/OutputStream和Reader/Writer。

2)    具體的構建角色(ConcreteComponent):定義一個將要接受附加責任的類。相當于i/o里面的FileOutputStream和FileInputStream。

3)    裝飾角色(Docorator):持有一個抽象構建(Component)角色的引用,并定義一個與抽象構件一致的接口。相當于i/o里面的FilerOutputStream和FilterInputStream。

4)    具體的裝飾角色(ConcreteDecorator):負責給構建對象“貼上”附加的責任。相當于i/o流里面的BufferedOutputStream和BufferedInputStream以及DataOutputStream和DataInputSrtream。

7.    裝飾模式的特點:

1)    裝飾對象和真實對象具有相同的接口,這樣客戶端對象就可以以真實對象的相同的方式和裝飾對象交互。

2)    裝飾對象包含一個真實對象的引用(reference).

3)    裝飾對象接受所有來自客戶端的請求,它把這些請求轉發給真實的對象。

4)    裝飾對象可以在轉發這些請求以前或者以后增加一些附加的功能。這樣就能確保在運行時,不用修改給定對象結構就可以在外部增加附加的功能。在面向對象的程序設計中,通常是使用繼承的關系來擴展給定類的功能。

8.    案例:

1)    抽象的構建接口:

復制代碼 代碼如下:

packagecom.abao.decorate;

 

public interface Component

{

   public void doSomething();

}


2)    具體的構建角色:
復制代碼 代碼如下:

packagecom.abao.decorate;

public class ConcreteComponent implements Component

{

   @Override

   public void doSomething()

   {

      System.out.println("功能A");

   }

}


3)    裝飾角色:
復制代碼 代碼如下:

packagecom.abao.decorate;

 

public class Decorate implements Component

{

   private Component component;

   public Decorate(Component component)

   {

      this.component = component;

   }

 

   @Override

   public void doSomething()

   {

      component.doSomething();

   }

}


4)    具體裝飾角色1:
復制代碼 代碼如下:

packagecom.abao.decorate;

 

public class ConcreteDecorate1 extends Decorate

{

   public ConcreteDecorate1(Component component)

   {

      super(component);

   }

   @Override

   public void doSomething()

   {

      super.doSomething();

    

      this.doAnotherDosomething();

   }

   private void doAnotherDosomething()

   {

      System.out.println("功能B");

   }

}


5)    具體裝飾角色2:
復制代碼 代碼如下:

packagecom.abao.decorate;

 

public class ConcreteDecorate2 extends Decorate

{

   public ConcreteDecorate2(Component component)

   {

      super(component);

   }

   @Override

   public void doSomething()

   {

      super.doSomething();

    

      this.doAnotherDosomething();

    

   }

   private void doAnotherDosomething()

   {

      System.out.println("功能C");

   }

}


6)    客戶端
復制代碼 代碼如下:

packagecom.abao.decorate;

 

public class Client

{

   public static void main(String[] args)

   {

 

      Component component = new ConcreteDecorate1(

        new ConcreteDecorate2(new ConcreteComponent()));

      component.doSomething();

   }

}


9.    完!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精河县| 曲松县| 荥经县| 岳西县| 年辖:市辖区| 修文县| 陇川县| 长治市| 天祝| 玉环县| 雷山县| 南和县| 台南县| 合水县| 福清市| 察隅县| 大冶市| 朝阳市| 甘洛县| 宁海县| 凤冈县| 孟连| 宁德市| 宜昌市| 武隆县| 高台县| 五原县| 关岭| 佛教| 元江| 彭州市| 竹山县| 盘锦市| 林芝县| 莱阳市| 昌平区| 昭平县| 师宗县| 应用必备| 镇坪县| 江达县|