什么是適配器模式?
適配器模式(adapter):將一個類的接口轉換成客戶希望的另外一個接口。
adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
什么時候運用適配器模式?
在想使用一個已經存在的類時,如果它的接口,也就是它的方法與我們當前的要求不相同時,就需要考慮用到適配器模式了。
一般而言,使用適配器模式是出于無奈之舉,一般存在于軟件開發(fā)后期或者維護期,在軟件設計階段,我們還是盡量避免該模式的使用。
適配器模式的組成
target:目標接口,也就是客戶所期待的接口。目標可以是具體的或者抽象的類,也可以是接口。
adpatee:需要適配的類。也就是我們需要與目標接口對接成功的類。
adapter:中間起到鏈接作用的類。通過在內部包裝一個adptee對象,將源接口轉換成目標接口。
適配器模式具體實現
適配器模式的結構
適配器模式的實現
target類:也就是目標類
1
2
3
4
5
6
7
|
class target { public virtual void request() { console.writeline( "普通請求" ); } } |
adaptee類:需要適配的類
1
2
3
4
5
6
7
|
class adaptee { public void specificrequest() { console.writeline( "特殊請求" ); } } |
adapter類:
1
2
3
4
5
6
7
8
9
10
11
|
class aapter : target { private adaptee adaptee = new adaptee(); /// <summary> /// 這樣就可以把表面調用request()方法變成實際調用specificrequest() /// </summary> public override void request() { adaptee.specificrequest(); } } |
主函數調用:
1
2
3
4
5
6
7
8
|
static void main( string [] args) { //對客戶端來說,調用的是target的request() target target = new aapter(); target.request(); console.read(); } |
實例解析
為了深化理解,我們準備一個具體的實例來分析。
姚明作為一個外籍的球員在進入nba初期,由于英文水平一般,常常聽不懂教練的指揮與安排,需要翻譯來全程跟隨以實現溝通。請就此來寫出具體的情況。
分析:
在這里,我們不難發(fā)現教練的指揮與安排就是target,姚明就是adaptee,而翻譯就理所當然成了adapter,那么我們就能分析出彼此的關系了。
具體實現:
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
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
|
class program { static void main( string [] args) { player b = new forwards( "a" ); b.attack(); player m = new guards( "b" ); m.attack(); //通過翻譯,姚明知道了需要做的事情 player ym = new translator( "姚明" ); ym.attack(); ym.defense(); console.read(); } abstract class player { protected string name; public player( string name) { this .name = name; } public abstract void attack(); public abstract void defense(); } /// <summary> /// 前鋒 /// </summary> class forwards : player { public forwards( string name) : base (name) { } public override void attack() { console.writeline( "前鋒{0} 進攻" , name); } public override void defense() { console.writeline( "前鋒{0} 防守" , name); } } /// <summary> /// 中鋒 /// </summary> class center : player { public center( string name) : base (name) { } public override void attack() { console.writeline( "中鋒{0} 進攻" , name); } public override void defense() { console.writeline( "中鋒{0} 防守" , name); } } /// <summary> /// 后衛(wèi) /// </summary> class guards : player { public guards( string name) : base (name) { } public override void attack() { console.writeline( "后衛(wèi){0} 進攻" , name); } public override void defense() { console.writeline( "后衛(wèi){0} 防守" , name); } } /// <summary> /// 翻譯是繼承于運動員的,因為他需要直接理解教練的意思 /// 但是他實際需要傳達的是外籍球員,所以他調用的是外籍球員所理解的方法=>也就是翻譯的作用 /// </summary> class translator : player { private foreigncenter fc = new foreigncenter(); public translator( string name) : base (name) { fc.name = name; } public override void attack() { fc.進攻(); } public override void defense() { fc.防守(); } } /// <summary> /// 作為外籍球員,他有自己的姓名和進攻防守方式等 /// 其他的事情交給翻譯就好了 /// </summary> class foreigncenter { private string name; public string name { get { return name; } set { name = value; } } public void 進攻() { console.writeline( "外籍中鋒{0} 進攻" , name); } public void 防守() { console.writeline( "外籍中鋒{0} 防守" , name); } } } |
適配器模式的優(yōu)缺點
像之前提到的適配器能在后期維護的時候起到很大的作用,能在開發(fā)新的功能的時候保護原來軟件的穩(wěn)定性,但是初期的時候還是能避免就盡量避免吧!
備注:文中所有代碼及知識點均來自于《大話設計模式》,本人屬于邊學邊看邊敲代碼邊總結的階段。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:http://www.cnblogs.com/Aries-rong/archive/2017/11/15/7837972.html