發現設計模式的學習越來越讓自己學習的東西太少了,應該多接觸一些東西,多出去走一走。
裝飾模式概念:
動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活(大話設計模式)
在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。(百度百科)
裝飾模式的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、動態的為一個對象增加功能,而且還能動態撤銷。(繼承不能做到這一點,繼承的功能是靜態的,不能動態增刪。)
缺點:產生過多相似的對象,不易排錯!
