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