介面卡模式

2021-07-29 18:25:29 字數 4209 閱讀 2075

第一次寫部落格啊,寫的不好的地方請多指教哦~

在介紹介面卡模式之前,先來看乙個經典的栗子啊~

每乙個國家的額定電壓都不一樣,但是我們的手機額定充電電壓是一定的。那假如我們每一次去到不同的國家,難道都要買乙個適配手機額定電壓的充電器嘛???當然是不用的,拿蘋果的充電器來說,它可以接受的輸入電壓不是一成不變的,而是有乙個範圍來適應不同情況下的輸入電壓,但是輸出電壓是固定的。

可以這樣來理解,將目標裝置看做 『介面』,各種電壓相當於 『功能相同的類』,電源介面卡就是 『需要實現的介面卡類』。

在ios開發中,當輸入資料的型別稍有差異的時候,可能需要修改原來寫好的**,也可能會有crash。。。這時候,就是介面卡模式派上用場的時候啦~它可以在不修改或者極少修改**的情況下,適應輸入資料型別不一。

話不多說,上**~~~~

1.直接賦值

@inte***ce cardview : uiview

//名字

@property (nonatomic,strong) nsstring *namestr;

//分割線條顏色

@property (nonatomic,strong) uicolor *linecolor;

//**

@property (nonatomic,strong) nsstring *phonenumberstr;

- (void)loaddata:(model*)data;

@end

cardview.m實現部分就不寫啦~~~

- (void)viewdidload

採用直接賦值的方法當然是最簡單的,但假如 linecolor 是乙個nsstring類物件 , 直接賦值會出錯, 

但是大片的修改已經寫好的**也不是乙個好辦法。 

最無語的情況大概就是你修改好了,linecolor又是uicolor類物件時,難道還要改回去嘛???

exo me???

2.物件賦值

新建立乙個model類,繼承於nsobject。

#import #import @inte***ce model : nsobject

@property (nonatomic,strong) nsstring *namestr;

@property (nonatomic,strong) uicolor *linecolor;

@property (nonatomic,strong) nsstring *phonenumberstr;

@end

有一些童鞋可能會說,這有變化嘛?和cardview.h沒啥區別啊~現在看來是沒區別,但是馬上就有啦~

在cardview.h加上

- (void)loaddata:(model*)data; 這個方法並在 .m 檔案實現。

實現上述方法

- (void)loaddata:(model *)data

- (void)viewdidload

看到這裡,有一些童鞋肯定就要問啦,那這種和直接賦值沒啥區別,改乙個資料還不是照樣用不了。對啦~接下來就是我們的重頭戲啊---

第一步:宣告乙個協議,在此我將它命名為cardviewprotocol,並且在該協議中有三個方法:

#import @protocol cardviewadapterprotocol - (nsstring *)namestr;

- (uicolor *)linecolor;

- (nsstring *)phonenumberstr;

@end

第二步:宣告乙個介面卡的類,在此命名為cardviewadapter類,需要與輸入的物件建立聯絡。

.h檔案

#import #import #import "cardviewadapterprotocol.h"

@inte***ce cardviewadapter : nsobject//輸入物件

@property (nonatomic, weak) id data;

//宣告該方法與輸入的物件建立聯絡

- (instancetype)initwithdata:(id)data;

@end

.m檔案

#import "cardviewadapter.h"

@implementation cardviewadapter

- (instancetype)initwithdata:(id)data

return self;

}//空實現cardviewprotocol裡的方法

- (nsstring *)namestr

- (uicolor *)linecolor

- (nsstring *)phonenumberstr

@end

第三步:在cardview類中載入實現了cardviewprotocol協議的資料

.h檔案

- (void)loaddata:(id )data;

.m檔案

- (void)loaddata:(id)data

第四步:拿剛剛的model類為例,建立乙個model類介面卡,繼承於cardviewadapter,名為modeladapter類,在 .m 檔案中重寫父類的方法,以實現資料的載入。

#import "modeladapter.h"

#import "model.h"

@implementation modeladapter

- (instancetype)initwithdata:(id)data

return self;

}- (nsstring *)namestr

- (uicolor *)linecolor

- (nsstring *)phonenumberstr

@end

最後,要在viewcontroller裡面實現啦~

- (void)viewdidload

最開始的時候說,如果有乙個輸入的引數型別不一致,腫麼辦?用這種方法就很容易解決啦~我們只需要對相應類的介面卡中,對父類方法重寫時,將輸入的資料型別轉化為我們想要的資料型別即可。

舉個栗子啦,linecolor 是 nsstring型別。

- (uicolor *)linecolor  else 

}

像這樣,乙個類有乙個介面卡的叫做類介面卡,對應的就肯定有物件介面卡啦。

假設現在有兩種型別的輸入引數(乙個類名為model,乙個類名為newmodel),我們要建立乙個物件介面卡,就把它叫做objectadapter好了。當然,與類介面卡相似,仍然繼承於cardviewadapter,還是在重寫父類的方法時,稍有不同。

#import "objectadapter.h"

#import "model.h"

#import "newmodel.h"

@implementation objectadapter

- (instancetype)initwithdata:(id)data

return self;

}- (nsstring *)namestr else if ([self.data ismemberofclass:[newmodel class]])

return namestr;

} //依次實現。。。

@end

當輸入資料的型別過多時,採用物件介面卡會讓**冗雜,一般情況下,乙個類乙個介面卡比較好。

看到這裡,很多童鞋會說,我用直接賦值才三行**,你這乙個介面卡又是整這又是整那的,還那麼的不好理解。對於沒有啥經驗的開發者就像我來說,這樣的寫法肯定是不好懂,但是它的可移植性高。說不定你的下乙個工程也剛好會用到這個呢,這種情況你只需要稍作修改就可以的啊。所以,對於像我這樣的小白,我覺得還是可以採用這種方法的,畢竟還是要提高程式設計能力的嘛~~~哈哈哈~~~

到這裡,我就介紹完畢啦~第一次寫,不好的地方請各位親指點,一起學習一起進步嘛~~~謝謝大家~撒花~~~手動筆芯~~~

介面卡模式(類介面卡 物件介面卡)

做個筆記 引用 public inte ce usb public inte ce psp public class usber implements usb 類介面卡 psp適用usb介面 public class usbadapter extends usber implements psp 物...

介面卡模式 預設介面卡,類介面卡,物件介面卡

模式思想 改變乙個類的對外介面 增加或減少 以滿足不同外部呼叫者的需求 角色成員 目標介面 target 客戶所期待的介面。目標可以是具體的或抽象的類,也可以是介面。需要適配的類 adaptee 需要適配的類或適配者類。介面卡 adapter 通過包裝乙個需要適配的物件,把原介面轉換成目標介面。適配...

設計模式 介面卡模式 類介面卡 物件介面卡

乙個小例子,便於理解,上 這是我們造的。現在想用這個方法。public class adaptee 類介面卡。對我們想要的方法封裝一下,target就能像之前一樣,呼叫request方法即可。public class adapter1 extends adaptee implements targe...