Decorator Pattern也稱包裝模式Wrapper Pattern荤傲,他的結(jié)構(gòu)圖跟代理模式非常的像颈渊,裝飾類去繼承原始類的接口,裝飾類在構(gòu)造函數(shù)中傳入原始類俊嗽,并持有成員變量引用。
當(dāng)我們要調(diào)用被原始類的某個方法的時候绍豁,我們是去調(diào)用裝飾類的同名方法,然后裝飾類做了一些額外的增強操作后竹揍,再去調(diào)用原始類的這個方法敬飒。
定義:
動態(tài)地給一個對象添加一些額外的職責(zé)。就增加功能來說鬼佣,比繼承更為靈活驶拱。
場景:
需要動態(tài)透明的擴展類的功能時。
Android中的實現(xiàn)
Context是一個抽象類晶衷,在裝飾模式中相當(dāng)于抽象組件蓝纲,其內(nèi)部定義了大量的抽象方法,比如startActivity方法税迷。
具體的實現(xiàn)是在ContextImpl中完成的。ContextImpl相當(dāng)于我們的組件具體實現(xiàn)類箭养。
我們知道Activity是繼承Context的,但是不是直接繼承毕泌,而是繼承ContextThemeWrapper,
ContextThemeWrapper又繼承了ContextWrapper撼泛。
ContextWrapper中持有了context的引用,看出來了ContextWrapper其實就是裝飾者愿题。當(dāng)我們在Acitivity中使用startActivity時损俭,其實是在ContextWrapper中調(diào)用了context.startActivity
注意
代理模式是對原來的對象進行控制,而裝飾模式是對原來的對象進行一個增強擴展杆兵。