該模式挺難理解,想了快一晚上。。。才算有點眉目。。。然后照搬一些java.io類還有servlet里面的過濾器終于有所領悟。
使用接口實現,下面給出代碼:

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

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