摘要:基本原理通過使用裝飾者模式,可以在運行時擴充一個類的功能。裝飾者模式是類繼承的另外一種選擇。相反,裝飾者模式是面向運行時候的對象實例的這樣就可以在運行時根據需要進行組合。一個裝飾者模式的示例是里的的實現。
一、裝飾者模式簡介
1.基本原理裝飾者模式,是面向對象編程領域中,一種動態地往一個類中添加新的行為的設計模式。就功能而言,裝飾者模式相比生成子類更為靈活,這樣可以給某個對象而不是整個類添加一些功能。
通過使用裝飾者模式,可以在運行時擴充一個類的功能。原理是:增加一個裝飾類包裹原來的類,包裹的方式一般是通過在將原來的對象作為修飾類的構造函數的參數。裝飾類實現新的功能,但是,在不需要用到新功能的地方,它可以直接調用原來的類中的方法。裝飾類必須和原來的類有相同的接口。
裝飾者模式是類繼承的另外一種選擇。類繼承在編譯時候增加行為,而裝飾者模式是在運行時增加行為。
當有幾個相互獨立的功能需要擴充時,這個區別就變得很重要。在有些面向對象的編程語言中,類不能在運行時被創建,通常在設計的時候也不能預測到有哪幾種功能組合。這就意味著要為每一種組合創建一個新類。相反,裝飾者模式是面向運行時候的對象實例的,這樣就可以在運行時根據需要進行組合。一個裝飾者模式的示例是JAVA里的Java I/O Streams的實現。
裝飾者模式的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); } }
這段代碼的功能是將控制臺中輸入的內容打印出來。
查看java api得知
BufferedInputStream繼承的是FilterInputStream,如下圖:
FilterInputStream繼承的是InputStream,并且有InputStream對象的一個引用
InputStream相當于Component,FileterInputStream相當于Decorator,BufferedInputStream相當于ConcreteDecorator,System.in相當于ConcreteComponent。
三、自己實現一個關于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設計模式
我的心愿是世界和平!~( ゜▽゜)つロ
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66609.html
摘要:從應用流向目的地稱為輸出流,從目的地流向應用稱為輸入流。裝飾器模式裝飾器模式允許向一個現有的對象添加新的功能,同時又不改變其結構。以及家屬對于裝飾器模式的體現,也以此類推。 流概述 Java中,流是一種有序的字節序列,可以有任意的長度。從應用流向目的地稱為輸出流,從目的地流向應用稱為輸入流。 Java的流族譜 Java的java.io包中囊括了整個流的家族,輸出流和輸入流的譜系如下所示...
摘要:設計模式無論是對于最底層的的編碼實現還是較高層的架構設計都有著重要的指導作用。所謂光說不練假把式,今天我就把項目中常見的應用場景涉及到的主要設計模式及其相關設計模式總結一下,用實例分析和對比的方式在一片文章中就把最常見的種設計模式梳理清楚。 設計模式無論是對于最底層的的編碼實現還是較高層的架構設計都有著重要的指導作用。所謂光說不練假把式,今天我就把項目中常見的應用場景涉及到的主要設計模...
摘要:若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式意味著一群裝飾者類,這些類用來包裝具體組件。裝飾者類反映出被裝飾組件類型。裝飾者會導致設計中出現許多小對象,如果過度使用,會讓程序變得很復雜。 嘿嘿嘿,你是不是很喜歡用繼承呢?感覺沒什么事情是一個爸爸類搞不定的,有的話就兩個,快來跟我看看這個模式吧,它能讓你斷奶,給愛用繼承的人一個全新的設計眼界。 直奔主題,你是否有聽說...
摘要:這是設計模式系列的第二篇,系列文章目錄如下用一句話總結那些殊途同歸的設計模式工廠策略模版方法美顏相機中的設計模式裝飾者模式幾乎所有的設計模式都是通過增加一層抽象來解決問題。 這是設計模式系列的第二篇,系列文章目錄如下: 用一句話總結那些殊途同歸的設計模式:工廠=?策略=?模版方法 美顏相機中的設計模式——裝飾者模式 幾乎所有的設計模式都是通過增加一層抽象來解決問題。 上一篇中提...
閱讀 1668·2023-04-26 00:30
閱讀 3145·2021-11-25 09:43
閱讀 2868·2021-11-22 14:56
閱讀 3183·2021-11-04 16:15
閱讀 1137·2021-09-07 09:58
閱讀 2014·2019-08-29 13:14
閱讀 3101·2019-08-29 12:55
閱讀 982·2019-08-29 10:57