摘要:基本原理通過使用裝飾者模式,可以在運行時擴充一個類的功能。裝飾者模式是類繼承的另外一種選擇。相反,裝飾者模式是面向運行時候的對象實例的這樣就可以在運行時根據(jù)需要進行組合。一個裝飾者模式的示例是里的的實現(xiàn)。
一、裝飾者模式簡介
1.基本原理裝飾者模式,是面向?qū)ο缶幊填I(lǐng)域中,一種動態(tài)地往一個類中添加新的行為的設(shè)計模式。就功能而言,裝飾者模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。
通過使用裝飾者模式,可以在運行時擴充一個類的功能。原理是:增加一個裝飾類包裹原來的類,包裹的方式一般是通過在將原來的對象作為修飾類的構(gòu)造函數(shù)的參數(shù)。裝飾類實現(xiàn)新的功能,但是,在不需要用到新功能的地方,它可以直接調(diào)用原來的類中的方法。裝飾類必須和原來的類有相同的接口。
裝飾者模式是類繼承的另外一種選擇。類繼承在編譯時候增加行為,而裝飾者模式是在運行時增加行為。
當有幾個相互獨立的功能需要擴充時,這個區(qū)別就變得很重要。在有些面向?qū)ο蟮木幊陶Z言中,類不能在運行時被創(chuàng)建,通常在設(shè)計的時候也不能預(yù)測到有哪幾種功能組合。這就意味著要為每一種組合創(chuàng)建一個新類。相反,裝飾者模式是面向運行時候的對象實例的,這樣就可以在運行時根據(jù)需要進行組合。一個裝飾者模式的示例是JAVA里的Java I/O Streams的實現(xiàn)。
裝飾者模式的UML類圖:
以 砂鍋羊肉面 為實例,別問為什么,(╯°□°)╯︵┻━┻
Component相當于Marmite(砂鍋)類:
public abstract class Marmite { String description = "砂鍋"; public String getDescription() { return description; } public abstract Integer cost(); @Override public String toString() { return "這是一碗:" + getDescription() + ",價格:" + cost() + "元"; } }
ConcreteComponent是NoddlesMarmite(砂鍋面條)類:
public class NoddlesMarmite extends Marmite { public NoddlesMarmite() { description = "砂鍋面條"; } public Integer cost() { return 8; } }
Decorator是MaterialDecorator
public abstract class MaterialDecorator extends Marmite { public abstract String getDescription(); }
ConcreteDecorator是MuttonMarmite:
public class MuttonMarmite extends MaterialDecorator { Marmite marmite; public MuttonMarmite(Marmite marmite) { this.marmite = marmite; } @Override public String getDescription() { return "羊肉、" + marmite.getDescription(); } @Override public Integer cost() { return 5 + marmite.cost(); } }
這是測試代碼:
public class MarmiteTest { public static void main(String[] args) { Marmite marmiteNoddle = new NoddlesMarmite(); System.out.println(marmiteNoddle.toString()); Marmite muttonMarmiteNoddle = new MuttonMarmite(marmiteNoddle); System.out.println(muttonMarmiteNoddle.toString()); } }二、Java API中裝飾者的運用
先看一段demo
public class JavaDemo { public static void main(String[] args) { System.out.println("請輸入一句話:"); BufferedInputStream bufferedInputStream = new BufferedInputStream(System.in); String msg = "wocao"; try { BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(bufferedInputStream)); msg = bufferedReader.readLine(); } catch (Exception e){ e.printStackTrace(); } System.out.println("輸入的是:" + msg); } }
這段代碼的功能是將控制臺中輸入的內(nèi)容打印出來。
查看java api得知
BufferedInputStream繼承的是FilterInputStream,如下圖:
FilterInputStream繼承的是InputStream,并且有InputStream對象的一個引用
InputStream相當于Component,F(xiàn)ileterInputStream相當于Decorator,BufferedInputStream相當于ConcreteDecorator,System.in相當于ConcreteComponent。
三、自己實現(xiàn)一個關(guān)于InputStream的ConcreteDecoratortalk is cheap, show me the code
public class LowerCaseInputStream extends FilterInputStream { public LowerCaseInputStream(InputStream in){ super(in); } @Override public int read() throws IOException { int c=super.read(); return (c==-1?c:Character.toLowerCase((char)c)); } @Override public int read(byte[] b, int off, int len) throws IOException { int result=super.read(b,off,len); for(int i=off;i不想解釋了,心累
看不懂的,送你一幅圖:---------------------------------------EOF--------------------------------------
參考資料:
https://zh.wikipedia.org/wiki...
Head First設(shè)計模式
我的心愿是世界和平!~( ゜▽゜)つロ
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/66609.html
摘要:從應(yīng)用流向目的地稱為輸出流,從目的地流向應(yīng)用稱為輸入流。裝飾器模式裝飾器模式允許向一個現(xiàn)有的對象添加新的功能,同時又不改變其結(jié)構(gòu)。以及家屬對于裝飾器模式的體現(xiàn),也以此類推。 流概述 Java中,流是一種有序的字節(jié)序列,可以有任意的長度。從應(yīng)用流向目的地稱為輸出流,從目的地流向應(yīng)用稱為輸入流。 Java的流族譜 Java的java.io包中囊括了整個流的家族,輸出流和輸入流的譜系如下所示...
摘要:設(shè)計模式無論是對于最底層的的編碼實現(xiàn)還是較高層的架構(gòu)設(shè)計都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項目中常見的應(yīng)用場景涉及到的主要設(shè)計模式及其相關(guān)設(shè)計模式總結(jié)一下,用實例分析和對比的方式在一片文章中就把最常見的種設(shè)計模式梳理清楚。 設(shè)計模式無論是對于最底層的的編碼實現(xiàn)還是較高層的架構(gòu)設(shè)計都有著重要的指導(dǎo)作用。所謂光說不練假把式,今天我就把項目中常見的應(yīng)用場景涉及到的主要設(shè)計模...
摘要:若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式意味著一群裝飾者類,這些類用來包裝具體組件。裝飾者類反映出被裝飾組件類型。裝飾者會導(dǎo)致設(shè)計中出現(xiàn)許多小對象,如果過度使用,會讓程序變得很復(fù)雜。 嘿嘿嘿,你是不是很喜歡用繼承呢?感覺沒什么事情是一個爸爸類搞不定的,有的話就兩個,快來跟我看看這個模式吧,它能讓你斷奶,給愛用繼承的人一個全新的設(shè)計眼界。 直奔主題,你是否有聽說...
摘要:這是設(shè)計模式系列的第二篇,系列文章目錄如下用一句話總結(jié)那些殊途同歸的設(shè)計模式工廠策略模版方法美顏相機中的設(shè)計模式裝飾者模式幾乎所有的設(shè)計模式都是通過增加一層抽象來解決問題。 這是設(shè)計模式系列的第二篇,系列文章目錄如下: 用一句話總結(jié)那些殊途同歸的設(shè)計模式:工廠=?策略=?模版方法 美顏相機中的設(shè)計模式——裝飾者模式 幾乎所有的設(shè)計模式都是通過增加一層抽象來解決問題。 上一篇中提...
閱讀 1688·2023-04-26 00:30
閱讀 3161·2021-11-25 09:43
閱讀 2890·2021-11-22 14:56
閱讀 3200·2021-11-04 16:15
閱讀 1160·2021-09-07 09:58
閱讀 2032·2019-08-29 13:14
閱讀 3118·2019-08-29 12:55
閱讀 998·2019-08-29 10:57