先列舉乙個生活中的場景。假如我們買了一套房(買不起。。),但是是乙個毛胚房(指沒有任何裝修的房子),只能住。那麼我們為了讓房子變得溫馨舒適,就要進行裝修了,這樣沒有改變房子原本用來居住的功能,還增加了很多新的功能(比如做飯)。
那麼這一期的裝飾模式就是基於這樣的動機,在不改變原有功能的情況下新增新功能。
那麼給乙個類或物件增加新的行為可以通過兩種方式來完成:
定義:動態的給乙個物件新增新的職責,就增加物件功能來說,比生成子類的方式要更加靈活。
模式結構圖:
說明:
抽象構件:
public
inte***ce
component
具體構建和抽象裝飾類
public
class
concretecomponent
implements
component
}public
class
decorator
implements
component
@override
public
void
show()
}
具體的裝飾類:
public
class
concretedecorator
extends
decorator
public
void
show()
}public
class
concretedecoratorb
extends
decorator
public
void
show()
}
測試:
public
class
decomain
}//執行結果
未裝飾前--
----
----
-我是目標物件。。。
開始裝飾。。。
第一次裝飾--
----
--我是目標物件。。。
增加新功能a。。。
第二次裝飾--
-------
我是目標物件。。。
新增第二個新功能。。。
裝飾兩次--
----
----
我是目標物件。。。
增加新功能a。。。
新增第二個新功能。。。
這裡舉了乙個簡單的例子,可以看出來裝飾模式的一些特點了。可以動態的增加新的功能,且容易控制新增新行為的時機。
優點
缺點
常見的使用場景
jlist list =
newjlist()
;jscrollpane jsp =
newjscrollpane
(list)
;
component target =
newconcretecomponent()
; component fist =
newconcretedecorator
(target)
; component sec =
newconcretedecoratorb
(target)
; component three =
newconcretedecoratorb
(fist);.
....
..
這個也好理解,就是多型的體現罷了。
concretedecorator obj =
newconcretedecorator
(target)
; obj.
newmethod()
;//新增的方法
注意事項 結構型設計模式 裝飾模式
裝飾模式動態地給乙個物件新增一些額外的職責,就增加功能來說,它比生成子類更靈活。也可以這樣說,裝飾模式把複雜類中的核心職責和裝飾功能區分開了,這樣既簡化了複雜類,有去除了相關類中重複的裝飾邏輯。裝飾模式沒有通過繼承原有類來擴充套件功能,但卻達到了一樣的目的,而且比繼承更加靈活,所以可以說裝飾模式是繼...
設計模式 裝飾者模式 結構型
裝飾者模式 動態的給一些物件新增一些職能,就增加功能來說,裝飾者比生成子類更靈活。模型圖 public abstract class componentpublic class concretecomponet extends component public abstract class deco...
java結構型設計模式 裝飾模式
1 模式理解 這個模式還是很好理解的,裝飾嘛,就像我們裝修房子一樣,就是在原有的基礎上進行改進。結構模式就是被裝飾的類都統一實現乙個介面,裝飾類也實現這個介面,用來做裝飾的類統一繼承這個裝飾類。舉個例子,有乙個小男孩,裝飾一下,有乙個可愛的小男孩,可愛就是用來裝飾的,裝飾完之後小男孩還是小男孩,就是...