装饰信封
有時 很多時候,我需要一個類實現通過使其他類的實例的接口。 聽起來很奇怪? 讓我給你看一個例子。 在Takes框架中有很多此類,它們的名稱都都類似于*Wrap 。 這是一個方便的設計概念,不幸的是,在Java中看起來相當冗長。 擁有更短的內容會很棒,例如在EO中。
西北西北(1959年),阿爾弗雷德·希區柯克(Alfred Hitchcock)
看一下Takes Framework中的RsHtml 。 它的設計看起來像這樣(只有一個主要構造函數的簡化版本):
class RsHtml extends RsWrap {RsHtml(final String text) {super(new RsWithType(new RsWithStatus(text, 200),"text/html"));} }現在,讓我們看一下它擴展的RsWrap :
public class RsWrap implements Response {private final Response origin;public RsWrap(final Response res) {this.origin = res;}@Overridepublic final Iterable<String> head() {return this.origin.head();}@Overridepublic final InputStream body() {return this.origin.body();} }如您所見,此“裝飾器”除“僅裝飾”外不執行任何操作。 它封裝了另一個Response ,并通過所有方法調用。
如果還不清楚,我將解釋RsHtml的用途。 假設您有文字,并且想創建一個Response :
String text = // you have it already Response response = new RsWithType(new RsWithStatus(text, HttpURLConnection.HTTP_OK),"text/html" );您可以使用RsHtml在許多地方一遍又一遍地執行這種裝飾器的組合 :
String text = // you have it already Response response = new RsHtml(text);這非常方便,但是RsWrap非常冗長。 太多的行沒有做任何特別的事情; 他們只是將所有方法調用轉發到封裝的Response 。
我們如何引入一個新概念“ decorators”,并使用一個新關鍵字decorates :
class RsHtml decorates Response {RsHtml(final String text) {this(new RsWithType(new RsWithStatus(text, 200),"text/html"))} }然后,為了創建一個對象,我們只需調用:
Response response = new RsHtml(text);裝飾器中沒有任何新方法,只有構造器。 這些家伙的唯一目的是創建其他對象并封裝它們。 它們并不是真正的通用對象。 它們僅幫助我們創建其他對象。
這就是為什么我稱它們為“裝飾信封”。
這個想法可能看起來與Factory設計模式非常相似,但是它沒有靜態方法 ,我們試圖在面向對象的編程中避免這種方法 。
您可能還會發現這些相關的帖子很有趣: 可組合裝飾器與命令式實用方法 ; 通過驗證裝飾器進行防御性編程 ; If-Then-Else是代碼氣味 ; 垂直和水平裝飾 ; 為什么InputStream設計錯誤 ;
翻譯自: https://www.javacodegeeks.com/2017/02/decorating-envelopes.html
總結
- 上一篇: ddos防御公司(ddos防护企业)
- 下一篇: java jquery_jQuery数据