乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      詳解JAVA面向?qū)ο蟮脑O(shè)計(jì)模式 (七)、裝飾模式

       路人甲Java 2021-07-11

      裝飾模式 Decorator


      裝飾模式比較簡(jiǎn)單,我就不單獨(dú)寫實(shí)現(xiàn)例子了。參考設(shè)計(jì)圖去實(shí)現(xiàn)不是什么問題。建議可以寫一寫找找感覺。

      在現(xiàn)實(shí)生活中,常常需要對(duì)現(xiàn)有產(chǎn)品增加新的功能或美化其外觀,如房子裝修、相片加相框等。在軟件開發(fā)過程中,有時(shí)想用一些現(xiàn)存的組件。這些組件可能只是完成了一些核心功能。但在不改變其結(jié)構(gòu)的情況下,可以動(dòng)態(tài)地?cái)U(kuò)展其功能。所有這些都可以釆用裝飾模式來實(shí)現(xiàn)。

      裝飾模式的定義與特點(diǎn)

      裝飾(Decorator)模式的定義:指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。

      裝飾(Decorator)模式的主要優(yōu)點(diǎn)有:

      • 采用裝飾模式擴(kuò)展對(duì)象的功能比采用繼承方式更加靈活。

      • 可以設(shè)計(jì)出多個(gè)不同的具體裝飾類,創(chuàng)造出多個(gè)不同行為的組合。

      其主要缺點(diǎn)是:裝飾模式增加了許多子類,如果過度使用會(huì)使程序變得很復(fù)雜。

      裝飾模式的結(jié)構(gòu)與實(shí)現(xiàn)

      通常情況下,擴(kuò)展一個(gè)類的功能會(huì)使用繼承方式來實(shí)現(xiàn)。但繼承具有靜態(tài)特征,耦合度高,并且隨著擴(kuò)展功能的增多,子類會(huì)很膨脹。如果使用組合關(guān)系來創(chuàng)建一個(gè)包裝對(duì)象(即裝飾對(duì)象)來包裹真實(shí)對(duì)象,并在保持真實(shí)對(duì)象的類結(jié)構(gòu)不變的前提下,為其提供額外的功能,這就是裝飾模式的目標(biāo)。下面來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。

      1. 模式的結(jié)構(gòu)

      裝飾模式主要包含以下角色。

      1. 抽象構(gòu)件(Component)角色:定義一個(gè)抽象接口以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。

      2. 具體構(gòu)件(Concrete Component)角色:實(shí)現(xiàn)抽象構(gòu)件,通過裝飾角色為其添加一些職責(zé)。

      3. 抽象裝飾(Decorator)角色:繼承抽象構(gòu)件,并包含具體構(gòu)件的實(shí)例,可以通過其子類擴(kuò)展具體構(gòu)件的功能。

      4. 具體裝飾(ConcreteDecorator)角色:實(shí)現(xiàn)抽象裝飾的相關(guān)方法,并給具體構(gòu)件對(duì)象添加附加的責(zé)任。

      裝飾模式的結(jié)構(gòu)圖如圖 1 所示。

      2. 模式的實(shí)現(xiàn)

      裝飾模式的實(shí)現(xiàn)代碼如下:

      package decorator;
      public class DecoratorPattern
      {
          public static void main(String[] args)
          {
              Component p=new ConcreteComponent();
              p.operation();
              System.out.println("---------------------------------");
              Component d=new ConcreteDecorator(p);
              d.operation();
          }
      }
      //抽象構(gòu)件角色
      interface  Component
      {
          public void operation();
      }
      //具體構(gòu)件角色
      class ConcreteComponent implements Component
      {
          public ConcreteComponent()
          {
              System.out.println("創(chuàng)建具體構(gòu)件角色");       
          }   
          public void operation()
          {
              System.out.println("調(diào)用具體構(gòu)件角色的方法operation()");           
          }
      }
      //抽象裝飾角色
      class Decorator implements Component
      {
          private Component component;   
          public Decorator(Component component)
          {
              this.component=component;
          }   
          public void operation()
          {
              component.operation();
          }
      }
      //具體裝飾角色
      class ConcreteDecorator extends Decorator
      {
          public ConcreteDecorator(Component component)
          {
              super(component);
          }   
          public void operation()
          {
              super.operation();
              addedFunction();
          }
          public void addedFunction()
          {
              System.out.println("為具體構(gòu)件角色增加額外的功能addedFunction()");           
          }
      }

      程序運(yùn)行結(jié)果如下:

      創(chuàng)建具體構(gòu)件角色
      調(diào)用具體構(gòu)件角色的方法operation()
      ---------------------------------
      調(diào)用具體構(gòu)件角色的方法operation()
      為具體構(gòu)件角色增加額外的功能addedFunction()

      裝飾模式的結(jié)構(gòu)圖

      裝飾模式的應(yīng)用場(chǎng)景

      前面講解了關(guān)于裝飾模式的結(jié)構(gòu)與特點(diǎn),下面介紹其適用的應(yīng)用場(chǎng)景,裝飾模式通常在以下幾種情況使用。

      • 當(dāng)需要給一個(gè)現(xiàn)有類添加附加職責(zé),而又不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。例如,該類被隱藏或者該類是終極類或者采用繼承方式會(huì)產(chǎn)生大量的子類。

      • 當(dāng)需要通過對(duì)現(xiàn)有的一組基本功能進(jìn)行排列組合而產(chǎn)生非常多的功能時(shí),采用繼承關(guān)系很難實(shí)現(xiàn),而采用裝飾模式卻很好實(shí)現(xiàn)。

      • 當(dāng)對(duì)象的功能要求可以動(dòng)態(tài)地添加,也可以再動(dòng)態(tài)地撤銷時(shí)。

      裝飾模式在 Java 語(yǔ)言中的最著名的應(yīng)用莫過于 Java I/O 標(biāo)準(zhǔn)庫(kù)的設(shè)計(jì)了。例如,InputStream 的子類 FilterInputStream,OutputStream 的子類 FilterOutputStream,Reader 的子類 BufferedReader 以及 FilterReader,還有 Writer 的子類 BufferedWriter、FilterWriter 以及 PrintWriter 等,它們都是抽象裝飾類。

      下面代碼是為 FileReader 增加緩沖區(qū)而采用的裝飾類 BufferedReader 的例子:

      BufferedReader in=new BufferedReader(new FileReader("filename.txt"));
      String s=in.readLine();

      裝飾模式的擴(kuò)展

      裝飾模式所包含的 4 個(gè)角色不是任何時(shí)候都要存在的,在有些應(yīng)用環(huán)境下模式是可以簡(jiǎn)化的,如以下兩種情況。

      (1) 如果只有一個(gè)具體構(gòu)件而沒有抽象構(gòu)件時(shí),可以讓抽象裝飾繼承具體構(gòu)件,其結(jié)構(gòu)圖如圖 4 所示。

      只有一個(gè)具體構(gòu)件的裝飾模式
      圖4 只有一個(gè)具體構(gòu)件的裝飾模式

      (2) 如果只有一個(gè)具體裝飾時(shí),可以將抽象裝飾和具體裝飾合并,其結(jié)構(gòu)圖如圖 5 所示。

      只有一個(gè)具體裝飾的裝飾模式
      圖5 只有一個(gè)具體裝飾的裝飾模式

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多