設計模式之裝飾者模式

2021-10-06 22:42:13 字數 3774 閱讀 7313

裝飾者模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

(引用 head first 設計模式)

一種動態地往乙個類中新增新的行為的設計模式。就功能而言,修飾模式相比生成子類更為靈活,這樣可以給某個物件而不是整個類新增一些功能。

通過使用修飾模式,可以在執行時擴充乙個類的功能。原理是:增加乙個修飾類包裹原來的類,包裹的方式一般是通過在將原來的物件作為修飾類的建構函式的引數。裝飾類實現新的功能,但是,在不需要用到新功能的地方,它可以直接呼叫原來的類中的方法。修飾類必須和原來的類有相同的介面。

(引用 維基百科)

這種型別屬於結構型模式,它是作為現有的類的乙個包裝。建立乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

* 飲料抽象類

* 被裝飾者抽象類

*/public

abstract

class

beverage

/** * 待每個不同型別的子類實現的方法

* @return

*/public

abstract

double

cost()

;}

/**

* 裝飾者抽象類

* 所有的輔料都要繼承該類

* 必須讓condiment decorator能取代beverage

*/public

abstract

class

condimentdecorator

extends

beverage

/**

* 被裝飾者實現類

* 濃咖啡

*/public

class

espresso

extends

beverage

@override

public

double

cost()

}

/**

* 摩卡是乙個裝飾者,對beverage進行裝飾

* 該類清楚知道被裝飾物件。因為需要持有被裝飾物件引用

* 1.持有被裝飾者的引用

* 2.保證被裝飾者的方法簽名的實現(getdescription())

* 3.實現裝飾(cost)

*/public

class

mocha

extends

condimentdecorator

@override

public string getdescription()

@override

public

double

cost()

}/**

* 1.持有被裝飾者的引用

* 2.保證被裝飾者的方法簽名的實現(getdescription())

* 3.實現裝飾(cost)

引用

流分類

使用分類

位元組輸入流

位元組輸出流

字元輸入流

字元輸出流

抽象基類

inputstream

outputstream

reader

writer

節點流訪問檔案

fileinputstreamfileoutstreamfilereaderfilewriter

節點流訪問數值

bytearrayinputstreambytearrayoutstreamchararrayreaderchararraywriter

節點流訪問管道

pipedinputstreampipedoutstreampipedreaderpipedwriter

節點流訪問字串

stringreaderstringwriter

處理流緩衝流

bufferedinputstream

bufferedoutputstream

bufferedreader

bufferedwriter

處理流轉換流

inputstreamreader

outputstreamwriter

處理流物件流

objectinputstream

objectoutputstream

處理流抽象基類(過濾)

filterinputstream

filteroutputstream

filterreader

filterwriter

處理流列印流

printstream

printwriter

處理流推回輸入流

pushbackinputstream

pushbackreader

處理流特殊流

datainputstream

dataoutputstream

節點流是真正處理資料的。處理流是裝飾者。

處理流

reader reader =

newfileread()

;

裝飾者和被裝飾物件有相同的超型別。所以在任何需要原始物件(被包裝的)的場合,可以用裝飾過的物件代替它。我們復用繼承達到型別匹配,而不是復用繼承獲得了行為

你可以用乙個或多個裝飾者包裝乙個物件。

裝飾者可以在所委託被裝飾者的行為之前與/或之後,加上自己的行為,以達到特定的目的。

物件可以在任何時候被裝飾,所以可以在執行時動態地、不限量地用你喜歡的裝飾者來裝飾物件。

侷限性導致程式中增加許多功能類似的很小的類

設計模式之 裝飾者模式

一 裝飾者模式 裝飾者模式又稱為包裝模式。動態地給乙個物件增加新的職責。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者模式顧名思義就是對乙個物件進行裝飾,具體怎樣裝飾呢?那就是給這個物件不斷的增加職責方法。給乙個物件增加方法不簡單啊,用繼承或者直接在物件的類中增加方法。如果我們要對自...

設計模式之裝飾者模式

此模式動態將職責附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更具彈性的代替方案,以一圖一概括。要點1 裝飾者和被裝飾物件有相同的超型別。2 可以用乙個或多個裝飾者包裝乙個物件。3 裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。4 物件可以在任何時候被裝飾,所以可...

設計模式之裝飾者模式

public abstract class beverage 返回當前飲品的 public abstract double cost 為了讓condiment decorator 調料裝飾者 能夠取代beverage,所以將它擴充套件至beverage類 public abstract class ...