設計模式—裝飾者模式
1裝飾着模式
思想:類應該支持拓展,不應修改
步驟原理:
1.創建裝飾抽象類去繼承要拓展類(被修飾類)的基類(如果繼承具體的被修飾類就成了普通繼承了)
=》讓子類傳送一個被裝飾類對象,調用被修飾類的方法
2.創建具體裝飾類 繼承抽象裝飾類
=》重寫基類的方法(將被裝飾者類的方法保留),添加自己需要的功能
3.具體調用 首先創建被修飾類的對象,將該對象傳給拓展類對象,
前言
在軟件開發中,經常對一類對象添加不同的功能,如果使用繼承來實現的話就則有定義多個類,比如手機類,子類可能會有stickerphone(貼膜手機類),accessoriesPhone(掛件手機類)等,這會導致很多的子類問題,於是我們可以使用裝飾者模式來動態給一個對象添加額外的職責,使用類的任意組合實現額外功能
裝飾者模式介紹
裝飾者模式以對客戶透明的方式動態給一個對象附加上更多的職責,裝設在模式相比生成子類可以更靈活的增加功能
1)實際例子
手機和手機配件演示裝飾者模式
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { ///
<summary> ///
手機抽象類,即裝飾者模式中的抽象組件類 ///
</summary> public abstract class Phone { public abstract void Print(); } ///
<summary> ///
蘋果手機,即裝飾着模式中的具體組件類 ///
</summary> public class ApplePhone
: Phone { public override void Print() { Console.WriteLine( "現在你的手機是蘋果牌的手機" ); } } ///
<summary> ///
裝飾抽象類,要讓裝飾完全取代抽象組件,所以必須繼承自Photo ///
其實該類定義成class 還是 abstract class運行上市沒有什麼區別的,所有的子類都需要重寫print方法,所以可以定義成抽象的, ///
但是又需要調用 _phone.Print();方法,所以print方法只能定義成可重寫的 ///
</summary> public abstract class Decorator
: Phone { private Phone
_phone; public Decorator(Phone
phone) { _phone
= phone; } public override void Print() { if (_phone
!= null ) _phone.Print(); } } ///
<summary> ///
貼膜,即具體裝飾者 ///
</summary> public class Sticker
: Decorator { public Sticker(Phone
phone) : base (phone)
{ } public override void Print() { base .Print(); AddSticker(); } public void AddSticker() { Console.WriteLine( "現在手機可以貼膜了" ); } } ///
<summary> ///
手機掛件 ///
</summary> public class Accessories
: Decorator { public Accessories(Phone
phone) : base (phone)
{ } public override void Print() { base .Print(); AddAccessories(); } public void AddAccessories() { Console.WriteLine( "現在手機可以添加掛件了" ); } } } |
調用方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
static void Main( string []
args) { Phone
apple = new ApplePhone(); Decorator
sticker = new Sticker(apple); sticker.Print(); Decorator
accessoried = new Accessories(apple); accessoried.Print(); Decorator
stickerAccessoried = new Accessories(sticker); stickerAccessoried.Print(); } |
運行結果:
從上面代碼看客戶端可以直接把手機配件添加到手機上,如果需要添加手機外殼,只需要繼承decorator的手機外殼類就好
2)裝飾者模式介紹
抽象構件角色(phone):給出一個抽象接口,以規範準備接受附件責任的對象
具體構件角色(applephone):定義一個將要接受附件責任的類
裝飾角色(dicorator):持有一個構件對象的實例,並定義一個與抽象構件接口一致的接口
具體裝飾角色(sticker,accessories):負責給構件對象添加附加的責任
3)裝飾者模式分析
優點:裝飾者模式和繼承的目的都是對象的擴展,裝飾者模式比繼承更靈活
通過不同的具體裝飾以及這些類的組合,可以創建出許多不同行爲的組合
具有很好的擴展性
缺點:導致出現許多小對象,過度使用使程序更復雜
4)使用場景
需要擴展一個類或給類添加附加功能
動態給一個對象添加功能,這些功能可以在動態的撤銷
需要添加一些有基本功能的排序組合而產生的非常大量的功能