《java與模式》學習系列——裝飾模式

來源:互聯網
上載者:User

 

一、裝飾(Decorator)模式的結構

裝飾模式以對用戶端透明的方式擴充項物件的功能,是繼承關係的一個替代方案。

裝飾模式有透明和半透明的兩種,這兩種的區別就在於裝飾角色的介面與抽象構件角色的介面是完全一致。半透明情況下裝飾角色的介面比抽象構件角色的介面寬。

所所示:

如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合并成一個類。

二、裝飾模式適用的情境

1、需要擴充一個類的功能,或給一個類增加附加責任。

2、需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。

3、需要增加由一些準系統的排列組合而產生的非常大量的功能,從而使繼承關係變得不現實。

裝飾模式的優點:

1、裝飾模式與繼承關係的目的都是要擴充項物件的功能,但是裝飾模式可以提供比繼承更多的靈活性。

2、通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

三、Factory 方法與其他模式的關係

適配器模式

裝飾模式和適配模式都是封裝(Wrapper)模式。適配器模式的用意是要改變所考慮的對象的介面而不一定改變對象的效能,而裝飾模式的用意是要保持介面,從而增加所考慮對象的效能。

策略模式

裝飾模式將一個東西的表皮換掉,而保持它的內心。策略模式恰好相反,它在保持介面不變的情況下,使具體演算法可以互換。

裝飾模式的實現要求Component類盡量地“輕”,而策略模式要求抽象策略類盡量的“重”。

合成模式

裝飾模式常常用在合成模式的行為擴充上。使用繼承關係擴充合成模式的行為很困難。裝飾模式是繼承關係的替代方案,裝飾模式可以動態地為合成模式添加新的行為。

四、裝飾模式在java中的應用

         java
I/O

java I/O庫的兩個對稱性和兩個設計模式

兩個對稱性

1、輸出—輸入對稱:比如InputStream和OutputStream各自佔據Byte流的輸入與輸出的兩個平行結構的根部:而Reader和Writer各自佔據Char流的輸入與輸出的兩個平行的等級結構的根部。

2、byte—char對稱:InputStream與Reader的子類分別負責Byte和Char流的輸入;OutputStream與Writer的子類分別負責Byte和Char流的輸出,它們分別形成平行的等級結構。

兩個設計模式

1、裝飾模式:在由InputStream、OutputStream、Reader和Writer代表的等級結構內部,有一些流處理器可以對另一流處理器起到裝飾作用,形成新的、具有改善了的功能的流處理器。

2、在由InputStream、OutputStream、Reader、Writer代表的等級結構內部,有一些流處理器是對其他類型的流源的適配。這就是適配器模式的應用。

 

InputStream中的裝飾模式:

InputStream類型中的裝飾模式是半透明的,換言之,連結流處理器在對源流處理器進行功能增強同時,改變了源流處理器的介面。例如:BufferedInputStream是一個半透明的裝飾類,因為他提供了額外的方法ensureOpen()、fill(),如果用戶端持有一個類型為InputStream的對象引用in的話,那麼如果用BufferedInputStream裝飾後,只要用戶端不需要使用像ensureOpen以及fill方法,用戶端就沒有問題。但是如果用戶端必須使用這兩個方法,那必須進行向下類型轉換,那麼這個類型轉換意味著用戶端必須知道它拿到的引用是指向一個類型為BufferedInputStream的對象的,這就破壞了使用裝飾的原始用意:不讓用戶端察覺它使用的僅是一個裝飾,而不是原始流角色。

Reader類型的裝飾模式:

 

InputStream中的適配器模式:

ByteArrayInputStream繼承了InputStream的介面,而封裝了一個byte數組。換言之,它將一個byte數組的介面適配成InputStream流處理器的介面。

StringBufferInputStream繼承了InputStream類型,同時持有一個對String對象的引用。這是一個將String對象適配成InputStream類型的對象形式的適配器模式

從byte流到char流的適配:

InputStreamReader是從byte輸入資料流到chr輸入資料流的一個適配器

OutputStreamWriter是從byte輸出資料流到char輸出資料流的一個適配器。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.