目錄git
上次咱們知道了單例模式是怎麼回事, 如今咱們來探討一下什麼叫作
單例模式
.github其實所謂的代理模式在咱們平常生活中很是的常見, 好比買車, 各式各樣的牌子都有, 但這些汽車生產商又不可能本身掏錢在每一個城市的每一個角落都開一家本身的直營店, 因此他們會去招一些第三方的代理商進行分銷, 而這個就是咱們今天所要說的
代理模式
.objective-c最後:
若是你有更好的建議或者對這篇文章有不滿的地方, 請聯繫我, 我會參考大家的意見再進行修改, 聯繫我時, 請備註代理模式
, 若是以爲好的話, 但願你們也能夠打賞一下~嘻嘻~祝你們學習愉快~謝謝~學習
Cain(羅家輝)ui
聯繫方式: zhebushimengfei@qq.comatom
騰訊QQ: 350116542代理
這是一張
代理模式
的UML圖, 一樣也很簡單的講解了代理模式
究竟是怎麼回事code順序以下:對象
- 1.
Client(客戶)
向Subject(代理店)
發起購買汽車的請求- 2.
Subject(代理店)
會向Proxy(生產商)
進行提單- 3.
Proxy(生產商)
按照提單進行交貨給Subject(代理店)
- 4.
Subject(代理點)
再交付給Client(客戶)
,
打開咱們本身建立的
DesignPatternWork
文件夾, 裏面有咱們以前所建立的DesignPatternWorkSpace
string
添加咱們所要建立的新工程, 命名爲
ProxyPattern
建立代理類
這裏咱們就拿奧迪這個汽車生產商來進行演示, 原諒我是個奧迪控~~
在這裏聲明兩個代理方法, 但他們有所區別, 一個是必須實現, 一個是可選類型的, 因爲方法名自注釋, 我這裏就不添加註釋了.
@required - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer orderQuantity:(NSInteger)orderQuantity;
@optional - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer audiDelegateInfo:(NSString *)audiDelegateInfo;
解釋一下, 爲何咱們須要在代理方法中提供代理類, 其實這個很好理解, 打個比方, 就拿奧迪來講吧, 一個品牌的車子, 確定有不一樣的型號, 而每一個型號不必定都是在同一家工廠裏生產的, 這個時候咱們就須要區分生產地, 因此咱們爲了提供外部去區分, 就須要在代理方法中提供代理類
(我的理解, 不是官方語言哈)
.
#import <Foundation/Foundation.h> @class AudiManufacturer; @protocol AudiManufacturerDelegate <NSObject> @required - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer orderQuantity:(NSInteger)orderQuantity; @optional - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer audiDelegateInfo:(NSString *)audiDelegateInfo; @end @interface AudiManufacturer : NSObject @property (nonatomic, weak) id<AudiManufacturerDelegate> delegate; - (void)buyCarCount:(NSInteger)count; - (void)buyCarModel:(NSString *)model; @end
在內部實現兩個對方開放的方法
#import "AudiManufacturer.h" @implementation AudiManufacturer - (void)buyCarCount:(NSInteger)count { if (self.delegate && [self.delegate respondsToSelector:@selector(audiManufacturer:orderQuantity:)]) { [self.delegate audiManufacturer:self orderQuantity:count]; } } - (void)buyCarModel:(NSString *)model { if (self.delegate && [self.delegate respondsToSelector:@selector(audiManufacturer:audiDelegateInfo:)]) { [self.delegate audiManufacturer:self audiDelegateInfo:model]; } } @end
代理類以及代理方法咱們已經完成了, 接下來咱們就要在外部去實現了
#import "ViewController.h" #import "AudiManufacturer.h" @interface ViewController () <AudiManufacturerDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; AudiManufacturer *audiManufacturer = [[AudiManufacturer alloc] init]; audiManufacturer.delegate = self; [audiManufacturer buyCarCount:2]; [audiManufacturer buyCarModel:@"Q7"]; } #pragma mark - 必須實現的方法 - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer orderQuantity:(NSInteger)orderQuantity { NSLog(@"奧迪生產商爲: %@", audiManufacturer); NSLog(@"購買的數量爲: %zd", orderQuantity); } #pragma mark - 可選實現的方法 - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer audiDelegateInfo:(NSString *)audiDelegateInfo { NSLog(@"奧迪生產商爲: %@", audiManufacturer); NSLog(@"購買的型號爲: %@", audiDelegateInfo); } @end
代理與協議的區別
到這裏, 咱們已經完成了整個代理模式的全部要求了, 但還有一些小細節須要提提.
代理職能:
下降對象與對象之間的耦合度
協議職能:
主要是用來約束對象或篩選對象
代理與協議的類似:
代理與協議都是使用@protocol
來進行聲明, 而且提供方法的一種模式, 看起來沒啥不同.
代理與協議的不一樣:
其實就如同它們的職能所說,代理
是爲了下降對象與對象之間的耦合度,協議
是用來約束對象或篩選對象
這裏咱們用代碼演示一下吧, 這樣子更加的簡單明瞭, 不過這裏要注意一下,
Protocol
是沒有.m
文件的
#import <Foundation/Foundation.h> @protocol AudiCustomerProtocol <NSObject> @required - (NSString *)isEnoughBuyCar:(NSInteger)money; @end
建立完協議就要建立顧客了, 而且這個顧客類是必須遵照咱們建立的
Protocol
, 而後在這個Protocol
里加個判斷.
#import <Foundation/Foundation.h> #import "AudiCustomerProtocol.h" @interface Customer : NSObject <AudiCustomerProtocol> @end
#import "Customer.h" @implementation Customer - (NSString *)isEnoughBuyCar:(NSInteger)money { if (money >= 1000000) { return @"您的錢足夠購買Q7"; } return @"您的錢不足以購買Q7"; } @end
如今咱們來初始化一下這個顧客類, 而且校驗一下咱們所寫的
Protocol
是否生效.
#import "ViewController.h" #import "AudiManufacturer.h" #import "Customer.h" @interface ViewController () <AudiManufacturerDelegate> @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; AudiManufacturer *audiManufacturer = [[AudiManufacturer alloc] init]; audiManufacturer.delegate = self; [audiManufacturer buyCarCount:2]; [audiManufacturer buyCarModel:@"Q7"]; Customer *customer = [[Customer alloc] init]; NSString *string = [customer isEnoughBuyCar:輸入你想要的數值]; NSLog(@"%@", string); } #pragma mark - 必須實現的方法 - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer orderQuantity:(NSInteger)orderQuantity { NSLog(@"奧迪生產商爲: %@", audiManufacturer); NSLog(@"購買的數量爲: %zd", orderQuantity); } #pragma mark - 可選實現的方法 - (void)audiManufacturer:(AudiManufacturer *)audiManufacturer audiDelegateInfo:(NSString *)audiDelegateInfo { NSLog(@"奧迪生產商爲: %@", audiManufacturer); NSLog(@"購買的型號爲: %@", audiDelegateInfo); } @end
先輸入
10000
再輸入
1000000
其實在iOS中, 就有一個類叫作
NSProxy
, 它也能夠用來實現代理模式
, 但在這裏先不作介紹, 後面有時間再另外寫一篇文章去講解怎麼用NSProxy
去實現代理模式, 若是有好奇心特別重的朋友, 也能夠自行去翻查一下資料~
通過上面的演示, 就知道
代理模式
並無想象中那麼複雜, 說白了, 所謂的代理模式
就是爲了下降對象與對象之間的耦合度, 爲了方便維護罷了, 同時咱們也知道了代理
與協議
之間的區別, 這篇文章就到了, 謝謝你們的觀看~
GitHub工程地址: https://github.com/CainRun/DesignPattern