適配器模式(Adapter),將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
適配器模式主要解決了什麼問題呢?
答:系統的數據和行爲都正確,但接口不符時,我們應該考慮適配器,目的是使控制範圍之外的一個原有對象與某個接口匹配。適配器模式主要應用於希望複用一些現存的類,但是接口又與複用環境要求不一致的情況。
其實,簡單的說,就是需要的東西就在面前,但卻不能使用,而短時間又無法改造它,於是我們就想辦法適配它。
在GoF的設計模式中,對適配器模式講了兩種類型,類適配器模式和對象適配器模式,由於類適配器模式通過多重繼承對接一個接口與另一個接口進行適配,而Objective C語言不支持多重繼承(協議除外,:D),所以這裏還是先分享一下對象適配器吧,有興趣的同學可以找找相關資料。
好的,讓我們看一看他的類結構圖吧。
看起來不難吧,搞了那麼多的專業術語,其實就是對接口的再一次封裝而已。好吧,不囉嗦了,下面就展示一下代碼吧。
-
Target類接口
1
2
3
4
5
|
#import
<Foundation/Foundation.h> @interface
Target: NSObject -( void )Request; @end |
-
Target類實現
1
2
3
4
5
6
7
8
9
|
#import
"Target.h" @implementation
Target -( void )Request{ NSLog (@ "普通請求!" ); } @end |
-
Adaptee類接口
1
2
3
4
5
6
7
|
#import
<Foundation/Foundation.h> @interface
Adaptee: NSObject -( void )SpecificRequest; @end |
-
Adaptee類實現
1
2
3
4
5
6
7
8
9
|
#import
"Adaptee.h" @implementation
Adaptee -( void )SpecificRequest{ NSLog (@ "特殊請求!" ); } @end |
-
Adapter類接口
1
2
3
4
5
6
7
|
#import
"Target.h" @class
Adaptee; @interface
Adapter :Target{ Adaptee
*adaptee; } @end |
-
Adapter類實現
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#import
"Adapter.h" #import
"Adaptee.h" @implementation
Adapter -( id )init{ if
( self
== [ super
init]) { adaptee
= [[Adaptee alloc]init]; } return
self ; } -( void )Request{ [adaptee
SpecificRequest]; } @end |
-
Main方法調用
1
2
3
4
5
6
7
8
9
10
11
|
#import
<Foundation/Foundation.h> #import
"Adapter.h" int
main( int
argc, const
char
*argv[]) { @autoreleasepool { Target
*target = [[Adapter alloc]init]; [target
Request]; } return
0; }
|