java中裝飾模式,java裝飾模式應用場景

本文目錄一覽:

java中裝飾模式,裝飾類和被裝飾類要實現同一個接口,為什麼?怎麼理解呢

裝飾者需要和被裝飾者必須是一樣的類型,原因有兩個:其一是裝飾者必須能取代被裝飾者,也就是說裝飾者可以脫離被裝飾者單獨使用。 其二是裝飾者和被裝飾者必須達到類型匹配,這樣他們才能組合在一起,然後共同去描述和修飾某一事物。

裝飾者模式,在java  jdk中典型的應用是io流:被裝飾者FileInputStream和裝飾者FilterInputStream都是繼承自InputStream。我把他們的類圖給你黏貼出來:

回答滿意的話給最佳噢~

關於java中裝飾者模式的詳解,不理解啊,,誰給解釋解釋。。。

DataInputStream bis = new DataInputStream(new BufferedInputStream(new FileInputStream(“File”)));

BufferedInputStream bis2 = new BufferedInputStream(new DataInputStream(new FileInputStream(“File”)));

BufferedInputStream添加了緩衝功能,請問,bis還有緩衝功能么?bis現在是DataInputStream類型的,bis2才是BufferedInputStream類型的,這是我學些IO的一個問題,為什麼bis還有緩衝功能?

問題:動態給一個對象添加一些額外的職責

思考:可以修改這個類的源代碼嗎?

回答:可以

思考:那直接修改源代碼就行了

問題:如果不可以修改呢?

思考:如果不可以修改源代碼,那怎麼添加?

回答:有一些類庫可以直接修改編譯後的class文件,但是這裡不考慮

         可以直接包含這個類的對象,如果這個類有實現某些接口,剛好某個需要添加額外智能的方法正好是其中一個方法,那就好辦了

Son這個類的paint()方法需要添加一些額外的功能

package decorator;

public class Son implements Work {

  public void paint() {

    System.out.println(“兒子用鉛筆畫好了一幅畫。”);

  }

}

這個類不是實現了Work方法嗎?那就好辦了,新建一個類,繼承Work接口:

package decorator;

public class Mother implements Work {

  //被裝飾者

  private Work work;

 

  public Mother(Work work) {

    this.work = work;

  }

 

  private Mother() {}

  public void paint() {

   

    //媽媽裝飾者做的職責

    System.out.println(“媽媽正在做給畫上顏色前的準備工作。”);

   

    //被裝飾者做的職責

    work.paint();

   

    //媽媽裝飾者做的職責

    System.out.println(“媽媽給畫上好了顏色。”);

  }

}

那個所謂的Work接口:

package decorator;

public interface Work {

  public void paint();

}

你不是想讓Son可以的paint方法多做點工作么?那我new出Mother類執行paint方法不就可以了嗎

看代碼就知道,其實這個裝飾器模式並不怎麼好用,每個需要裝飾的類或者需要繼承某個接口,這實在是一個限制

網上找的資料:

裝飾模式(Decorator)

裝飾模式又名包裝(Wrapper)模式。

裝飾模式以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案。

裝飾模式通過創建一個包裝對象,也就是裝飾,來包裹真實的對象。

裝飾模式以對客戶端透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。

裝飾模式可以在不創造更多子類的情況下,將對象的功能加以擴展。

裝飾模式把客戶端的調用委派到被裝飾類。裝飾模式的關鍵在於這種擴展是完全透明的。

裝飾模式的角色

抽象構件角色(Component):給出一個抽象接口,以規範準備接收附加責任的對象。

具體構件角色(Concrete Component):定義將要接收附加責任的類。

裝飾角色(Decorator):持有一個構件(Component)對象的引用,並定義一個與抽象構件接口一致的接口。

具體裝飾角色(Concrete Decorator):負責給構件對象「貼上」附加的責任。

Java IO中的裝飾模式

在IO中,具體構件角色是節點流,裝飾角色是過濾流。

FilterInputStream和FilterOutputStream是裝飾角色,而其他派生自它們的類則是具體裝飾角色。

裝飾模式的特點

裝飾對象和真實對象有相同的接口。這樣客戶端對象就可以以和真實對象相同的方式和裝飾對象交互。

裝飾對象包含一個真實對象的引用(reference)。

裝飾對象接收所有來自客戶端的請求,它把這些請求轉發給真實的對象。

裝飾對象可以在轉發這些請求之前或之後附加一些功能。

這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。

程序實例

public interface Component

{

    public void doSomething();

}

這是抽象構件角色,是一個接口。具體構件角色實現這個接口:

public class ConcreteComponent implements Component

{

    @Override

    public void doSomething()

    {

        System.out.println(“功能A”);

    }

}

 裝飾角色:

public class Decorator implements Component

{

    private Component component;

    public Decorator(Component component)

    {

        this.component = component;

    }

    @Override

    public void doSomething()

    {

        component.doSomething();

    }

}

其中包含了構件角色的引用,方法調用中利用構件角色的方法。

具體裝飾角色(兩個):

public class ConcreteDecorator1 extends Decorator

{

    public ConcreteDecorator1(Component component)

    {

        super(component);

    }

    

    @Override

    public void doSomething()

    {

        super.doSomething();

        

        this.doAnotherThing();

    }

    

    private void doAnotherThing()

    {

        System.out.println(“功能B”);

    }

}

public class ConcreteDecorator2 extends Decorator

{

    public ConcreteDecorator2(Component component)

    {

        super(component);

    }

    @Override

    public void doSomething()

    {

        super.doSomething();

        

        this.doAnotherThing();

    }

    

    private void doAnotherThing()

    {

        System.out.println(“功能C”);

    }

}

使用測試:

public class Client

{

    public static void main(String[] args)

    {

        Component component = new ConcreteComponent();

        

        Component component1 = new ConcreteDecorator1(component);

        

        component1.doSomething();

        System.out.println(“———–“);

        

        Component component2 = new ConcreteDecorator2(component1);

        

        component2.doSomething();

    }

}

輸出:

功能A

功能B

———–

功能A

功能B

功能C

java裝飾模式和繼承的區別

java裝飾模式和繼承的區別如下:

裝飾模式以對客戶透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端並不會覺得對象在裝飾前和裝飾後有什麼不同。裝飾模式可以在不使用創造更多子類的情況下,將對象的功能加以擴展。

java問題 想問下 裝飾者模式有什麼實際用途呢?能舉個實際應用的例子嗎?

裝飾者模式用來擴展對象的功能,給對象添加不同的功能。在io流中,比如 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(“d:/text.txt”)))); 這種對File類的包裝,由內層到外層擴展輸入流的功能,就是一個典型的裝飾者模式。inputstream是被裝飾對象,然後Fileinputstream、InputStream、BufferedReader都是它的裝飾器,用來擴展它的功能!

什麼是java裝飾設計模式

在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。

舉例:

public class Test {

    // 將內容寫到另一個文件

    public void write() {

        String string = “測試包裝模式”;

        try {

            FileWriter fw = new FileWriter(“D:/copyfile.txt”);

            // 用到包裝模式,擴展FileWriter的功能

            BufferedWriter bW = new BufferedWriter(fw);

            bW.write(string);

            bW.flush();

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

    public static void main(String[] args) {

        Test test = new Test();

        test.write();

    }

}

執行結果:

java靜態代理和裝飾模式的區別

裝飾模式:以對客戶端透明的方式擴展對象的功能,是繼承關係的一個替代方案;

代理模式:給一個對象提供一個代理對象,並有代理對象來控制對原有對象的引用;

裝飾模式應該為所裝飾的對象增強功能;代理模式對代理的對象施加控制,並不提供對象本身的增強功能

二者的實現機制確實是一樣的,可以看到他們的實例代碼重複是很多的。但就語義上說,這兩者的功能是相反的,模式的一個重要作用是簡化其他程序員對你程序的理解,你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大家就知道是在限制。

原創文章,作者:NRH9W,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/128063.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
NRH9W的頭像NRH9W
上一篇 2024-10-03 23:24
下一篇 2024-10-03 23:24

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Unity3D 創建沒有 Terrain Tile 的場景

    這篇文章將會介紹如何在 Unity3D 中創建一個沒有 Terrain Tile 的場景,同時也讓讀者了解如何通過編程實現這個功能。 一、基礎概念 在 Unity3D 中,Terr…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論