java設計模式之裝飾模式


  發現設計模式的學習越來越讓自己學習的東西太少了,應該多接觸一些東西,多出去走一走。

裝飾模式概念:

  動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活(大話設計模式)

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

裝飾模式的UML圖

  

裝飾模式的代碼

package com.roc.decorate;
/**
 * 打架      裝飾模式      這次學習裝飾模式我們就舉一個小混混打了一個小孩,突然遇見小孩的媽媽看見了,這肯定不能說在打她兒子呀,只能說跟她兒子玩一玩,小孩子害怕小混混肯定也會說是的,媽媽我們在玩呢,但是實際情況是在被打
 * @author liaowp
 *
 */
public abstract class Fight {
        
    /**
     * 拳打
     */
    public abstract void boxing();
    
}
package com.roc.decorate;

public class TrueFight extends Fight{

    @Override
    public void boxing() {
        System.out.println("打一拳");
    }

}
package com.roc.decorate;

public class DscribeFight  extends TrueFight{
      /**
       * 你肯定不能說是直接打,要描述、描述
       */
       private void say(){
           System.out.println("阿姨,我在跟小明玩一玩呢");
       }
       
       public void boxing(){
           this.say();
           super.boxing();
           System.out.println("玩的還不錯");
       }
}
package com.roc.decorate;
/**
 * 客戶端
 * @author liaowp
 *
 */
public class Client {
    public static void main(String[] args) {
        Fight fight=new DscribeFight();
        fight.boxing();
    }
}

裝飾模式的理解

  (1) 裝飾對象和真實對象有相同的接口。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。
  (2) 裝飾對象包含一個真實對象的引用(reference)
  (3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。
  (4) 裝飾對象可以在轉發這些請求以前或以后增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。

裝飾器模式的應用場景:

  1、需要擴展一個類的功能。

  2、動態的為一個對象增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)

  缺點:產生過多相似的對象,不易排錯!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM