GoF
:
動(dòng)態(tài)地給一個(gè)對象添加一些額外的職責(zé)。就增加功能來說,Decorator(裝飾)模式相比生成子類更為靈活。
在系統(tǒng)開發(fā)的過程中,我們希望給某個(gè)對象而不是整個(gè)類添加一些功能。例如:我們要做一扇門,現(xiàn)在為了能將門做的美觀和安全需要給門加上鎖和把手,還可能給門加上窗戶和雕花。這里我們把這些要添加的東西叫做門的屬性。
使用繼承機(jī)制是添加功能的一種有效途徑,從其他類繼承過來的屬性可以被多個(gè)子類的實(shí)例所使用。但這種方式不夠靈活,因?yàn)槿绻覀兊拈T做工過細(xì)價(jià)錢也就高,有些顧客可能不需要這樣的門。這樣我們就需要靈活添加門的屬性。
一種較為靈活的方式是使用Decorator模式。Decorator模式的效果是:讓我們可以創(chuàng)建以decorator對象—負(fù)責(zé)新的功能的對象—開始的一條對象“鏈”,并結(jié)束于最初的對象。
Decorator
模式幫助我們將問題分解為兩個(gè)部分:
l???????
如何實(shí)現(xiàn)提供新功能的對象。
l???????
如何為每種特定情況將對象組織起來。
一個(gè)實(shí)際的例子是Java的I/O類就廣泛使用了Decorator模式,大家有興趣可以去研究一下。直到現(xiàn)在我還沒有研究過。
裝飾模式包括如下角色:
l???????
抽象構(gòu)件(Component):給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對象。
l???????
具體構(gòu)件(Concrete Component):定義一個(gè)將要接收附加責(zé)任的類。
l???????
裝飾(Decorator):持有一個(gè)構(gòu)件對象的實(shí)例,并定義一個(gè)與抽象構(gòu)件接口一致的接口。
l???????
具體裝飾(Concrete Decorator):負(fù)責(zé)給構(gòu)件對象“貼上”附加的責(zé)任。
下面是Decorator模式的UML圖:
下面是事例代碼:

?2

?3

?4

?5


?6

?7

?8

?9

10

11

12

13



14

15

16

17

18

19

20

21

package Decorator;
/*
?* 具體的一個(gè)門
?*/
public class Door extends Component
{
?????? public void sampleOperation()
?????? {
????????????? System.out.println("Build a door!");
?????? }//end sampleOperation()
}//end class Door

?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

?
package Decorator;
/*
?* 用來裝飾門的把手
?*/
public class Knob extends Decorator
{
?????? public Knob(Component component)
?????? {
????????????? super(component);
?????? }//end ConcreteDecorator2(...)
??? public void sampleOperation()
??? {
???????? super.sampleOperation ();
???????? System.out.println("Add an Knob( 把手 )");
??? }//end sampleOperation()
}//END CLASS Knob
package Decorator;
/*
?* 用來裝飾門的門鎖
?*/
public class Lock extends Decorator
{
?????? public Lock(Component component)
?????? {
????????????? super(component);
?????? }//end ConcreteDecorator1(...)
?????? public void sampleOperation()
?????? {
????????????? super.sampleOperation ();
????????????? System.out.println("Add a lock( 鎖 )");
?????? }//end sampleOperation()
}//end class Lock

?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

下面是執(zhí)行結(jié)果:
Decorator Pattern!
Build a door!
Add a lock(
鎖
)
Add an Knob(把手)