該模式挺難理解,想了快一晚上。。。才算有點(diǎn)眉目。。。然后照搬一些java.io類(lèi)還有servlet里面的過(guò)濾器終于有所領(lǐng)悟。
使用接口實(shí)現(xiàn),下面給出代碼:

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

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83


84

85

86


87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105


106

107

108


109

110

111

112

113

114

115

116

117

118

119

120

121

122

關(guān)鍵點(diǎn):
1、Decorator抽象類(lèi)中,持有Human接口,方法全部委托給該接口調(diào)用,目的是交給該接口的實(shí)現(xiàn)類(lèi)即子類(lèi)進(jìn)行調(diào)用。
2、Decorator抽象類(lèi)的子類(lèi)(具體裝飾者),里面都有一個(gè)構(gòu)造方法調(diào)用super(human),這一句就體現(xiàn)了抽象類(lèi)依賴(lài)于子類(lèi)實(shí)現(xiàn)即抽象依賴(lài)于實(shí)現(xiàn)的原則。因?yàn)闃?gòu)造里面參數(shù)都是Human接口,只要是該Human的實(shí)現(xiàn)類(lèi)都可以傳遞進(jìn)去,即表現(xiàn)出Decorator dt = new Decorator_second(new Decorator_first(new Decorator_zero(human)));這種結(jié)構(gòu)的樣子。所以當(dāng)調(diào)用dt.wearClothes();dt.walkToWhere()的時(shí)候,又因?yàn)槊總€(gè)具體裝飾者類(lèi)中,都先調(diào)用super.wearClothes和super.walkToWhere()方法,而該super已經(jīng)由構(gòu)造傳遞并指向了具體的某一個(gè)裝飾者類(lèi)(這個(gè)可以根據(jù)需要調(diào)換順序),那么調(diào)用的即為裝飾類(lèi)的方法,然后才調(diào)用自身的裝飾方法,即表現(xiàn)出一種裝飾、鏈?zhǔn)降念?lèi)似于過(guò)濾的行為。
3、具體被裝飾者類(lèi),可以定義初始的狀態(tài)或者初始的自己的裝飾,后面的裝飾行為都在此基礎(chǔ)上一步一步進(jìn)行點(diǎn)綴、裝飾。
4、裝飾者模式的設(shè)計(jì)原則為:對(duì)擴(kuò)展開(kāi)放、對(duì)修改關(guān)閉,這句話體現(xiàn)在我如果想擴(kuò)展被裝飾者類(lèi)的行為,無(wú)須修改裝飾者抽象類(lèi),只需繼承裝飾者抽象類(lèi),實(shí)現(xiàn)額外的一些裝飾或者叫行為即可對(duì)被裝飾者進(jìn)行包裝。所以:擴(kuò)展體現(xiàn)在繼承、修改體現(xiàn)在子類(lèi)中,而不是具體的抽象類(lèi),這充分體現(xiàn)了依賴(lài)倒置原則,這是自己理解的裝飾者模式。