最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

裝飾模式能在不必改變原類文件和使用繼承的情況下,動態(tài)地擴展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實的對象。JDK中IO的設(shè)計就用到了裝飾模式,通過過濾流對節(jié)點流進行包裝來實現(xiàn)功能的擴展。

裝飾模式的角色的組成:

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

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

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

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

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

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

3. 裝飾角色:持有一個對象構(gòu)建角色的引用,并且實現(xiàn)抽象構(gòu)件角色。實現(xiàn)抽象構(gòu)件角色是因為要保證增加了功能過后,類型不能發(fā)生改變,就像FilterInputStream還是一個輸入流,仍然帶有輸入流的特性。而持有一個對象構(gòu)建角色的引用是因為要想增加功能,就必須持有要被附加功能的構(gòu)件角色的引用。

package com.tydic.decorator;
/**
 * 裝飾角色,持有一個構(gòu)件角色的引用,并且實現(xiàn)構(gòu)件角色
 * 要想增加功能過后還是這個類型的構(gòu)件就必須實現(xiàn)構(gòu)件角色,要想增加功能,就必須持有要被附加功能的構(gòu)件角色的引用,這就是為什么必須持有一個構(gòu)件角色的引用
 * @author Administrator
 *
 */
public class Decorator implements Component {
  private Component component;//這是要被附加功能的構(gòu)件角色,可通過實例化的時候傳進來
  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);//對component這個構(gòu)件進行裝飾
    Component component3 = new ConcreteDecorator2(component2);//對component2這個構(gòu)件進行裝飾
    component3.doSomething();
  }
}

總結(jié):

裝飾模式能夠利用組合的做法,再不用繼承的情況下,在運行時動態(tài)的對對象進行擴展。這是繼承所做不到的。繼承是靜態(tài)的,對類的擴展。

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

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

缺點:會使程序變的比較復(fù)雜。

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

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

相關(guān)文章

  • 詳解JAVA常用的時間操作【實用】

    詳解JAVA常用的時間操作【實用】

    本文主要介紹了JAVA一些常用的時間操作,很實用,相信大家在開發(fā)項目時會用到,下面就跟小編一起來看下吧
    2016-12-12
  • 分析Netty直接內(nèi)存原理及應(yīng)用

    分析Netty直接內(nèi)存原理及應(yīng)用

    Netty作為一個流行的應(yīng)用框架,它的強悍之處是性能強悍,可以輕松承載數(shù)萬并發(fā); 其編程模型簡單,容易上手; 這就給大家打開了一扇通向高性能的大門。高效io模型略去不說,我們今天主要來看看內(nèi)存控制這塊的強大之處
    2021-06-06
  • Java日期處理工具類DateUtils詳解

    Java日期處理工具類DateUtils詳解

    這篇文章主要為大家詳細介紹了Java日期處理工具類DateUtils的相關(guān)代碼,包含日期和時間常用操作,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java之HashMap案例詳解

    Java之HashMap案例詳解

    這篇文章主要介紹了Java之HashMap案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • JVM GC 垃圾收集梳理總結(jié)

    JVM GC 垃圾收集梳理總結(jié)

    這篇文章主要介紹了JVM GC 垃圾收集梳理總結(jié),GC是一種自動的存儲管理機制。當(dāng)一些被占用的內(nèi)存不再需要時,就應(yīng)該予以釋放,這種存儲資源管理,稱為垃圾回收
    2022-07-07
  • Mabitis中的#與$符號區(qū)別及用法介紹

    Mabitis中的#與$符號區(qū)別及用法介紹

    這篇文章主要介紹了Mabitis中的#與$符號區(qū)別,需要的朋友可以參考下
    2017-02-02
  • SpringMVC打印請求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案

    SpringMVC打印請求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案

    項目中經(jīng)常需要打印http請求的參數(shù)和響應(yīng)數(shù)據(jù),本文給大家講解如何在SpringMVC打印請求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決

    maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決

    這篇文章主要介紹了maven導(dǎo)入本地倉庫jar包,報:Could?not?find?artifact的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 聊聊單線程的Redis為何會快到飛起

    聊聊單線程的Redis為何會快到飛起

    Redis想必大家都或多或少聽過吧,我們在工作學(xué)習(xí)中通常用它來作為緩存使用,既然是作為緩存,大家的第一反應(yīng)肯定是:這家伙很快
    2022-02-02
  • MyBatis連接池的深入和動態(tài)SQL詳解

    MyBatis連接池的深入和動態(tài)SQL詳解

    這篇文章主要介紹了MyBatis連接池的深入和動態(tài)SQL詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

宿迁市| 宜州市| 乌鲁木齐县| 玉龙| 宣恩县| 二手房| 博野县| 铅山县| 荣成市| 台东市| 蕲春县| 宜宾市| 临桂县| 丹巴县| 汨罗市| 杭州市| 阿克苏市| 柳林县| 安塞县| 麻阳| 新营市| 轮台县| 周至县| 吉安市| 牙克石市| 张北县| 深圳市| 宁夏| 阳曲县| 惠来县| 隆回县| 千阳县| 吉林省| 桂阳县| 霍城县| 于都县| 和林格尔县| 佛学| 全椒县| 乌鲁木齐市| 东明县|