裝飾者模式(decorator pattern)是指在不改變原有物件的基礎之上,將功能附加到對 象上,提供了比繼承更有彈性的替代方案(擴充套件原有物件的功能),屬於結構型模式。
裝飾者在**程式中適用於以下場景:
1、用於擴充套件乙個類的功能或給乙個類新增附加職責。
2、動態的給乙個物件新增功能,這些功能可以再動態的撤銷。
一般來說裝飾者模式有下面幾個參與者:
首先建立乙個煎餅 battercake 類:
public
class
battercake
public
intgetprice()
}
建立乙個加雞蛋的煎餅 battercakewithegg 類:
public
class
battercakewithegg
extends
battercake
@override
public
intgetprice()
}
再建立乙個既加雞蛋又加香腸的 battercakewitheggandsausage 類:
public
class
battercakewitheggandsausage
extends
battercake
@override
public
intgetprice()
}
編寫客戶端測試**:
public
class
test
}
執行結果:
煎餅,總**:5
煎餅+1 個雞蛋,總**:6
煎餅+1 根香腸,總**:7
執行結果沒有問題。但是,如果使用者需要乙個加 2 個雞蛋加 1 根香腸的煎餅,那麼用我 們現在的類結構是建立不出來的,也無法自動計算出**,除非再建立乙個類做定製。 如果需求再變,一直加定製顯然是不科學的。那麼下面我們就用裝飾者模式來解決上面 的問題。首先建立乙個建煎餅的抽象 battercake 類:
public
abstract
class
battercake
建立乙個基本的煎餅(或者叫基礎**)basebattercake:
public
class
basebattercake
extends
battercake
public
intgetprice()
}
然後,再建立乙個擴充套件**的抽象裝飾者 battercakedecotator 類:
public
abstract
class
battercakedecotator
extends
battercake
protected
abstract
void
dosomething()
;public string getmsg()
public
intgetprice()
}
然後,建立雞蛋裝飾者 eggdecorator 類:
public
class
eggdecorator
extends
battercakedecotator
protected
void
dosomething()
@override
public string getmsg()
@override
public
intgetprice()
}
建立香腸裝飾者 sausagedecorator 類:
public
class
sausagedecorator
extends
battercakedecotator
protected
void
dosomething()
@override
public string getmsg()
@override
public
intgetprice()
}
編寫客戶端測試**:
public
class
test2
}
來看一下類圖:
裝飾者模式
介面卡模式
形式是一種非常特別的介面卡模式
沒有層級關係,裝飾器模式有層級關係
定義裝飾者和被裝飾者都實現同乙個接 口,主要目的是為了擴充套件之後依舊保 留 oop 關係
介面卡和被適配者沒有必然的聯絡,通 常是採用繼承或**的形式進行包裝
關係滿足 is-a 的關係
滿足 has-a 的關係
功能注重覆蓋、擴充套件
注重相容、轉換
設計前置考慮
後置考慮
裝飾器模式在原始碼中也應用得非常多,在 jdk 中體現最明顯的類就是 io 相關的類,如 bufferedreader、inputstream、outputstream,看一下常用的 inputstream 的類結 構圖:
優點:1、裝飾者是繼承的有力補充,比繼承靈活,不改變原有物件的情況下動態地給乙個物件 擴充套件功能,即插即用。
2、通過使用不同裝飾類以及這些裝飾類的排列組合,可以實現不同效果。
3、裝飾者完全遵守開閉原則。
裝飾者模式
裝飾者模式 動態地將責任附加到物件上。若要擴張功能,裝飾者提供了比繼承更有彈性的替代方案。裝飾者可以在所委託被裝飾者的行為之前或之後,加上自己的行為,以達到特定的目的。裝飾者與被裝飾者物件具有相同的超型別。include include using namespace std class bever...
裝飾者模式
裝飾者模式,是在不改變原類檔案和使用繼承的情況下,動態地擴充套件乙個物件的功能。它是通過建立乙個包裝物件,也就是裝飾來包裹真實的物件。裝飾者模式中的角色 1 被裝飾者抽象component,是乙個介面或抽象類,就是定義最核心的物件,也是最原始的物件,這個類是需要裝飾類的基類。2 被裝飾者具體實現co...
裝飾者模式
裝飾者模式 裝飾者模式的好處是便於擴充套件,對乙個東西不管怎麼變,只需要找到相應的元件去改變它 1.如何組裝在一起 建立主題 packetbodycreator body new packetbodycreator 建立header packethtmlheadercreator html new ...