欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java設(shè)計(jì)模式之裝飾模式原理與用法實(shí)例詳解

 更新時(shí)間:2018年04月27日 09:15:52   作者:aronykl  
這篇文章主要介紹了Java設(shè)計(jì)模式之裝飾模式原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了裝飾模式的概念、原理、定義與使用方法,并總結(jié)分析了裝飾模式的優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下

本文實(shí)例講述了Java設(shè)計(jì)模式之裝飾模式原理與用法。分享給大家供大家參考,具體如下:

裝飾模式能在不必改變?cè)愇募褪褂美^承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。它是通過創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來包裹真實(shí)的對(duì)象。JDK中IO的設(shè)計(jì)就用到了裝飾模式,通過過濾流對(duì)節(jié)點(diǎn)流進(jìn)行包裝來實(shí)現(xiàn)功能的擴(kuò)展。

裝飾模式的角色的組成:

抽象構(gòu)件(Component)角色:給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收附加工功能的對(duì)象。(InputStream、OutputStream)
具體構(gòu)件(Concrete Component)角色:定義一個(gè)將要接收附加功能的類。(節(jié)點(diǎn)流)
裝飾(Decorator)角色:持有一個(gè)構(gòu)件(Component)對(duì)象的實(shí)例,并實(shí)現(xiàn)一個(gè)與抽象構(gòu)件接口一致的接口。(過濾流FilterInputStream、FilterOutputStream)
具體裝飾(Concrete Decorator)角色:負(fù)責(zé)給構(gòu)件對(duì)象添加上附加的功能。(帶具體附加功能的過濾流,BufferedInputStream,DataInputStream等)

以下給出一個(gè)裝飾模式的簡單的例子:

1. 抽象構(gòu)件角色:定義一個(gè)接口Component

package com.tydic.decorator;
//抽象構(gòu)件角色
public interface Component {
  public void doSomething();
}

2. 具體構(gòu)建角色:需要實(shí)現(xiàn)抽象構(gòu)件角色,可以給這個(gè)對(duì)象添加一些職責(zé)。

package com.tydic.decorator;
/**
 * 具體構(gòu)建角色,實(shí)現(xiàn)抽象構(gòu)建角色
 * @author Administrator
 *
 */
public class ConcreteComponent implements Component {
  @Override
  public void doSomething() {
    System.out.println("功能A");
  }
}

3. 裝飾角色:持有一個(gè)對(duì)象構(gòu)建角色的引用,并且實(shí)現(xiàn)抽象構(gòu)件角色。實(shí)現(xiàn)抽象構(gòu)件角色是因?yàn)橐WC增加了功能過后,類型不能發(fā)生改變,就像FilterInputStream還是一個(gè)輸入流,仍然帶有輸入流的特性。而持有一個(gè)對(duì)象構(gòu)建角色的引用是因?yàn)橐朐黾庸δ埽捅仨毘钟幸桓郊庸δ艿臉?gòu)件角色的引用。

package com.tydic.decorator;
/**
 * 裝飾角色,持有一個(gè)構(gòu)件角色的引用,并且實(shí)現(xiàn)構(gòu)件角色
 * 要想增加功能過后還是這個(gè)類型的構(gòu)件就必須實(shí)現(xiàn)構(gòu)件角色,要想增加功能,就必須持有要被附加功能的構(gòu)件角色的引用,這就是為什么必須持有一個(gè)構(gòu)件角色的引用
 * @author Administrator
 *
 */
public class Decorator implements Component {
  private Component component;//這是要被附加功能的構(gòu)件角色,可通過實(shí)例化的時(shí)候傳進(jìn)來
  public Decorator(Component component) {
    this.component = component;
  }
  @Override
  public void doSomething() {
    component.doSomething();
  }
}

4. 具體裝飾角色:需要繼承裝飾角色,并且給出要附加的功能

package com.tydic.decorator;
/**
 * 具體裝飾角色1,需要繼承裝飾角色,并且給出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator1 extends Decorator {
  public ConcreteDecorator1(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在傳過來的具體構(gòu)件角色原有功能的基礎(chǔ)上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能B");
  }
}

package com.tydic.decorator;
/**
 * 具體裝飾角色2,需要繼承裝飾角色,并且給出要附加的功能
 * @author Administrator
 *
 */
public class ConcreteDecorator2 extends Decorator {
  public ConcreteDecorator2(Component component) {
    super(component);
  }
  @Override
  public void doSomething() {
    super.doSomething();
    this.doAnothing();//在傳過來的具體構(gòu)件角色原有功能的基礎(chǔ)上附加的功能
  }
  //附加的功能
  public void doAnothing() {
    System.out.println("功能c");
  }
}

5. 編寫客戶端代碼

package com.tydic.decorator;
public class Client {
  public static void main(String[] args) {
    Component component = new ConcreteComponent();//具體構(gòu)建角色
    Component component2 = new ConcreteDecorator1(component);//對(duì)component這個(gè)構(gòu)件進(jìn)行裝飾
    Component component3 = new ConcreteDecorator2(component2);//對(duì)component2這個(gè)構(gòu)件進(jìn)行裝飾
    component3.doSomething();
  }
}

總結(jié):

裝飾模式能夠利用組合的做法,再不用繼承的情況下,在運(yùn)行時(shí)動(dòng)態(tài)的對(duì)對(duì)象進(jìn)行擴(kuò)展。這是繼承所做不到的。繼承是靜態(tài)的,對(duì)類的擴(kuò)展。

裝飾模式的優(yōu)缺點(diǎn):

優(yōu)點(diǎn):1.擴(kuò)展對(duì)象的功能,比繼承更加靈活。2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設(shè)計(jì)師可以創(chuàng)造出很多不同行為的組合。

缺點(diǎn):會(huì)使程序變的比較復(fù)雜。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java面向?qū)ο蟪绦蛟O(shè)計(jì)入門與進(jìn)階教程》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 利用MyBatis進(jìn)行不同條件的like模糊查詢的方法

    利用MyBatis進(jìn)行不同條件的like模糊查詢的方法

    這篇文章主要介紹了利用MyBatis進(jìn)行不同條件的like模糊查詢,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • JDK19新特性使用實(shí)例詳解

    JDK19新特性使用實(shí)例詳解

    這篇文章主要為大家介紹了JDK19新特性使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • Spring Boot 中嵌入式 Servlet 容器自動(dòng)配置原理解析

    Spring Boot 中嵌入式 Servlet 容器自動(dòng)配置原理解析

    這篇文章主要介紹了Spring Boot 中嵌入式 Servlet 容器自動(dòng)配置原理解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • MyBatisPlus PaginationInterceptor分頁插件的使用詳解

    MyBatisPlus PaginationInterceptor分頁插件的使用詳解

    這篇文章主要介紹了MyBatisPlus PaginationInterceptor分頁插件的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 關(guān)于SpringBoot禁止循環(huán)依賴解說

    關(guān)于SpringBoot禁止循環(huán)依賴解說

    這篇文章主要介紹了關(guān)于SpringBoot禁止循環(huán)依賴解說,Spring的Bean管理,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Spring?Cloud?Eureka高可用配置(踩坑記錄)

    Spring?Cloud?Eureka高可用配置(踩坑記錄)

    在進(jìn)行Eureka高可用配置時(shí),控制臺(tái)一直出現(xiàn)“......”的錯(cuò)誤,但是在瀏覽器中輸入地址:peer1:8761 卻是可正常運(yùn)行,這篇文章主要介紹了Spring?Cloud踩坑之Eureka高可用配置,需要的朋友可以參考下
    2023-08-08
  • Java中超高頻常見字符操作合集(建議收藏)

    Java中超高頻常見字符操作合集(建議收藏)

    這篇文章主要為大家詳細(xì)介紹了Java中超高頻常見字符操作合集,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)java有一定的幫助,需要的小伙伴可以參考下
    2023-10-10
  • java 自動(dòng)生成略縮圖示例代碼

    java 自動(dòng)生成略縮圖示例代碼

    本篇文章,在前輩的經(jīng)驗(yàn)基礎(chǔ)上,分別對(duì)單圖生成略縮圖和批量生成略縮圖做個(gè)小結(jié)
    2013-07-07
  • java實(shí)現(xiàn)登錄之后抓取數(shù)據(jù)

    java實(shí)現(xiàn)登錄之后抓取數(shù)據(jù)

    這篇文章給大家分享了用JAVA實(shí)現(xiàn)在登陸以后抓取網(wǎng)站的數(shù)據(jù)的相關(guān)知識(shí),有興趣的朋友可以測試參考下。
    2018-07-07
  • IDEA設(shè)置生成帶注釋的getter和setter的圖文教程

    IDEA設(shè)置生成帶注釋的getter和setter的圖文教程

    通常我們用idea默認(rèn)生成的getter和setter方法是不帶注釋的,當(dāng)然,我們同樣可以設(shè)置idea像MyEclipse一樣生成帶有Javadoc的模板,具體設(shè)置方法,大家參考下本文
    2018-05-05

最新評(píng)論