天天看點

《設計模式修煉真經》11 — 裝飾模式

1、定義

裝飾模式的定義:在不改變現有對象結構的情況下,動态地給該對象增加一些職責(增加其額外功能);

裝飾模式是一種非常常見的設計模式;在軟體開發過程中,有時想用一些現存的元件,這些元件可能隻完成了一些核心功能,如果想要在不改變其結構的情況下動态地擴充其功能,這個時候就可以采用裝飾模式;

2、類圖

裝飾模式的通用類圖如下:

《設計模式修煉真經》11 — 裝飾模式

裝飾模式主要包括以下四種角色:

  • 抽象元件(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中重要的也是較難了解的内容;

本課程從反射的定義、作用、原理和使用出發,全方位幫你徹底搞定反射;

您的點贊是我前進的動力~