概述
裝飾模式是對客戶端以透明的方式擴展對象的功能,是繼承關系的一個替代方案。也就是說,客戶端并不會覺得對象在裝飾前和裝飾后有什么不同,裝飾模式可以在不用創造更多子類的情況下,將對象的功能加以擴展,裝飾模式的關鍵在于這種擴展是完全透明的。
模式的結構
UML類圖:
裝飾模式中的類角色:
抽象構件角色(Project):給出一個接口,以規范準備接收附加責任的對象
具體構件角色(Employe):定義一個將要接收附加責任的類
裝飾角色(Manager):持有一個構件對象的實例,并定義一個與抽象構件接口一致的接口
具體裝飾角色(ManagerA,ManagerB):負責給構件對象“貼上”附加的責任
代碼示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package interview; interface Project{ void doCoding(); } class Employe implements Project{ @Override public void doCoding() { System.out.println( "工程師在編程......" ); } } class Manager implements Project{ private Project project; public Manager(Project project){ this .project = project; } @Override public void doCoding() { startNewWork(); project.doCoding(); } public void startNewWork(){} } class ManagerA extends Manager{ public ManagerA(Project project) { super (project); } @Override public void startNewWork() { System.out.println( "開發經理開始新的工作計劃" ); } } class ManagerB extends Manager{ public ManagerB(Project project) { super (project); } @Override public void startNewWork() { System.out.println( "測試經理開始新的工作計劃" ); } } public class MainTest { public static void main(String arg[]) { Project project = new Employe(); Project managerA = new ManagerA(project); Project managerB = new ManagerB(project); managerA.doCoding(); managerB.doCoding(); } } |
裝飾模式優缺點:
優點:
裝飾模式與繼承的目的都是要擴展對象的功能,但是裝飾模式可以提供比繼承更多的靈活性。裝飾模式允許系統動態決定“貼上”一個需要的“裝飾”,繼承關系則不同,繼承關系是靜態的,它在系統運行前就決定了。
通過使用不同的具體裝飾類以及這些裝飾類的組合,設計師可以創造很多不同的行為組合。
缺點:
由于使用裝飾模式,可以比使用繼承關系需要較少數目的類。使用較少的類,當然使設計比較易于進行。但是,在另一方面,使用裝飾模式會產生比使用繼承關系更多的對象。更多的對象會使得差錯變得困難,特別是這些對象看上去都很像。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。