1、定義
裝飾模式的定義:在不改變現有對象結構的情況下,動态地給該對象增加一些職責(增加其額外功能);
裝飾模式是一種非常常見的設計模式;在軟體開發過程中,有時想用一些現存的元件,這些元件可能隻完成了一些核心功能,如果想要在不改變其結構的情況下動态地擴充其功能,這個時候就可以采用裝飾模式;
2、類圖
裝飾模式的通用類圖如下:
裝飾模式主要包括以下四種角色:
- 抽象元件(Component):是一個接口或者是抽象類,定義核心的功能,也就是最原始的對象;
- 具體元件(ConcreteComponent):是最核心、最原始、最基本的接口或抽象類的實作,也是要裝飾的對象;
- 抽象裝飾者(Decorator):一般是一個抽象類,實作了Component的接口或者抽象方法,它裡面不一定有抽象方法但必然有一個私有變量指向Component抽象元件;
- 具體裝飾者(ConcreteDecorator):具體的裝飾類,把ConcreteComponent裝飾成其他東西;
3、代碼實作
裝飾模式 的Java代碼實作如下:
//抽象元件
public abstract class Component {
//抽象的方法
public abstract void operate();
}
//具體元件
public class ConcreteComponent extends Component {
@Override
public void operate() {
...
}
}
//抽象裝飾者
public abstract class Decorator extends Component {
//一個Component的私有變量
private Component component = null;
//通過構造函數傳遞被修飾者
public Decorator(Component _component){
this.component = _component;
}
//委托給被修飾者執行
@Override
public void operate() {
this.component.operate();
}
}
//具體的裝飾者
public class ConcreteDecorator1 extends Decorator {
//定義被修飾者
public ConcreteDecorator1(Component _component){
super(_component);
}
//定義自己的修飾方法
private void method1(){
...
}
//重寫父類的Operation方法
public void operate(){
this.method1();
super.operate();
}
}
public class ConcreteDecorator2 extends Decorator {
//定義被修飾者
public ConcreteDecorator2(Component _component){
super(_component);
}
//定義自己的修飾方法
private void method2(){
...
}
//重寫父類的Operation方法
public void operate(){
super.operate();
this.method2();
}
}
//使用舉例
public class Client {
public static void main(String[] args) {
Component component = new ConcreteComponent();
//第一次修飾
component = new ConcreteDecorator1(component);
//第二次修飾
component = new ConcreteDecorator2(component);
//修飾後運作
component.operate();
}
}
4、特點
優點:
1、裝飾是繼承的有力補充,比繼承靈活
裝飾模式可以在不改變原有對象的情況下,動态的給一個對象擴充功能,即插即用;
2、通過使用不同裝飾類及這些裝飾類的排列組合,可以實作不同效果;
3、裝飾類和被裝飾類可以獨立發展,而不會互相耦合;
4、裝飾器模式完全遵守開閉原則;
缺點:
裝飾模式會增加許多子類,過度使用會增加程式的複雜性,尤其是多層裝飾的情況下;
5、适用場景
裝飾模式通常适用于以下場景:
1、當需要給一個現有類添加附加職責,而又不能采用生成子類的方法進行擴充時。
例如,該類被隐藏或者該類是終極類或者采用繼承方式會産生大量的子類。
2、當需要通過對現有的一組基本功能進行排列組合而産生更多功能時,采用繼承關系很難實作,而采用裝飾器模式卻很好實作;
3、當對象的功能要求可以動态地添加,也可以再動态地撤銷時;
我的視訊課
下面是我錄制的一些視訊課,歡迎大家圍觀~
《設計模式修煉真經》 設計模式是一套被反複使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結,代表了最佳的實踐,通常被有經驗的面向對象的軟體開發人員所采用。 本套課程深入介紹了經典的23種設計模式,并加入了自己的感悟,希望大家能夠徹底掌握設計模式,寫出最好的代碼,達到無招勝有招的境界,最終超越這23種設計模式。
《徹底搞定JVM》 JVM是Java中重要的也是較難了解的内容; 面試者對JVM的了解程度某種程度上反映了面試者技術深度,是以JVM也是面試時經常考察的内容; 本課程從JVM運作流程、資料運作時區域組成部分、類加載機制、垃圾回收機制、記憶體模型、常見面試題講解等角度出發,幫你徹底搞定JVM,拿下心儀Offer;
《Android性能優化參考》 本課程包含了Android中的App啟動優化、UI優化、記憶體優化、圖檔優化、耗電量等常見的性能優化場景,通過學習此課程,你将對整個Android性能優化體系有清晰的認識。
性能優化作為Android進階開發的必備技能,也是大廠面試必考的題目,是展現一個人技術深度最好的試金石。
《面試之排序算法》 排序算法是我們面試被問到最多的基礎算法,本課程詳細介紹了七種排序算法,包括插入排序、選擇排序、冒泡排序、謝爾排序、快速排序、堆積排序和二路并歸排序。每種算法都詳細介紹了核心思想、詳細步驟、時間複雜度和代碼實作,希望幫助大家深入了解排序算法,搞定面試!
《Android HyBrid App開發實戰》 本課程為Android HyBrid App開發實戰課程,由淺入深,從三種App的曆史和特點開始,介紹了Android WebView的使用、Java和JS互動的原生方式、著名的WebView安全漏洞、JSBridge的原理和使用,最後通過一個網上商城的實戰綜合全部内容,讓同學們掌握并深入了解Android HyBrid App開發。
《AI導論》 介紹人工智能AI的誕生曆史和到現在為止的不同發展階段;介紹了AI領域中常見的名詞概念和其關系,包括機器學習、深度學習、神經網絡結構搜尋 NAS、生成對抗網絡 GAN等;最後對AI發展做出展望。 本課程屬于導論課程,旨在幫助同學們從宏觀層面把握AI,建立AI的知識體系。
《Java注解精講》 本課程詳細介紹了Java中的注解機制,包括注解的定義和分類,注解的使用和自定義,注解的源碼和架構分析; 本課程語言簡單凝練,視訊短小精悍,讓你一次徹底搞懂Java注解!
《Java反射精講》 反射是Java中重要的也是較難了解的内容;
本課程從反射的定義、作用、原理和使用出發,全方位幫你徹底搞定反射;
您的點贊是我前進的動力~