您好,登錄后才能下訂單哦!
一、什么是裝飾器模式
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬于結構型模式,它是作為現有的類的一個包裝。
這種模式創建了一個裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
在不想增加更多子類的情況下擴展類,動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾器模式相比生成子類更為靈活。
二、裝飾器模式的具體實現
1、結構圖
2、分析
裝飾器模式由組件和裝飾者組成。
3、java 代碼實現:
抽象組件:
package com.designpattern.decoratorPattern; /** * Component 組件 抽象角色 * @author zhongtao on 2018/10/23 */ public interface House { /** * 裝飾風格 */ void style(); }
具體組件:
/** * 具體組件 * @author zhongtao on 2018/10/23 */ public class ChineseStyle implements House { @Override public void style() { System.out.println("中式風格裝修"); } } /** * 具體組件 * @author zhongtao on 2018/10/23 */ public class EuropeanStyle implements House { @Override public void style() { System.out.println("歐式風格裝修"); } }
抽象裝飾類:
package com.designpattern.decoratorPattern; /** * 抽象裝飾類 * * @author zhongtao on 2018/10/23 */ public class HouseDecorator implements House { public House house; public HouseDecorator(House house) { this.house = house; } @Override public void style() { house.style(); } }
具體裝飾類:
package com.designpattern.decoratorPattern; /** * 具體裝飾類 * * @author zhongtao on 2018/10/23 */ public class RedDecorator extends HouseDecorator { public RedDecorator(House house) { super(house); } public void style() { this.house.style(); System.out.println("紅色裝飾墻"); } }
測試裝飾器模式:
package com.designpattern.decoratorPattern; import org.junit.Test; /** * 測試裝飾器模型 * * @author zhongtao on 2018/10/22 */ public class DecoratorPatternTest { /** * 測試裝飾器模型 */ @Test public void testDecoratorPattern(){ ChineseStyle chineseStyle = new ChineseStyle(); House redChineseStyle = new RedDecorator(new ChineseStyle()); House redEuropeanStyle = new RedDecorator(new EuropeanStyle()); System.out.println("中式裝修"); chineseStyle.style(); System.out.println("\n中式加紅色墻"); redChineseStyle.style(); System.out.println("\n歐式加紅色墻"); redEuropeanStyle.style(); } }
測試結果:
---中式裝修---
中式風格裝修
---中式加紅色墻---
中式風格裝修
紅色裝飾墻
---歐式加紅色墻---
歐式風格裝修
紅色裝飾墻
三、裝飾器的優缺點
1、優點
2、缺點
多層裝飾比較復雜。
源碼地址
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。