iOS 层层推进实现代理模式
生活随笔
收集整理的這篇文章主要介紹了
iOS 层层推进实现代理模式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.代理模式核心思想:A類委托B類做某件事,然后A類獲取B類的執(zhí)行的返回結(jié)果!
舉例:女孩想去買電影票,但是自己不親自去而是委托男孩了解電影電影票信息,同時(shí)女孩獲得男孩買票的結(jié)果,代碼模擬實(shí)現(xiàn):
/*********************************** Gril.h *************************************/ #import <Foundation/Foundation.h> @class Boy; @interface Gril : NSObject// “女孩”想去買電影票 - (void)buyTicket;// “女孩”聲明自己的代理對(duì)象 @property (nonatomic,retain) Boy *boy; // @property (nonatomic,retain) Boy *delegate;@end /*********************************** Gril.m *************************************/ #import "Gril.h" #import "Boy.h"@implementation Gril// “女孩”想買電影票 - (void)buyTicket {// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 剩余電影票的個(gè)數(shù)int count = [_boy leftTicketsCount];// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 單張電影票的價(jià)格double price = [_boy ticketPrice];// 輸出女孩獲得的信息NSLog(@"還剩%d張電影票,每張票價(jià)是%.2f元",count,price);}// Girl類引用了Boy類 那么在Girl類釋放之前先釋放Boy對(duì)象 - (void)dealloc {[_boy release];[super dealloc]; } @end /*********************************** Boy.h *************************************/ #import <Foundation/Foundation.h>@interface Boy : NSObject// 查詢單張票價(jià) - (double)ticketPrice; // 查詢還剩多少張電影票 - (int)leftTicketsCount;@end /*********************************** Boy.m *************************************/ #import "Boy.h" @implementation Boy// 實(shí)現(xiàn)單張票價(jià)的查詢 - (double)ticketPrice {return 20; }// 實(shí)現(xiàn)剩余的電影票 - (int)leftTicketsCount {return 3; } @end /*********************************** main.m *************************************/ #import <Foundation/Foundation.h> #import "Boy.h" #import "Gril.h" int main(int argc, const char * argv[]) {@autoreleasepool {Gril *gril = [[[Gril alloc] init] autorelease];Boy *boy = [[[Boy alloc] init] autorelease];// 為girl中的boy屬性賦值 完成"代理思想"gril.boy = boy; // gril.delegate = boy; [gril buyTicket];}return 0; }?小結(jié):可以看出Gril類的代理對(duì)象已固定是Boy類,這樣的話代碼耦合性太強(qiáng),如果下次需要修改Gril類的代理對(duì)象為其他對(duì)象則不便于修改
?修改后的代碼如下:
?
/*********************************** Gril.h *************************************/ #import <Foundation/Foundation.h> #import "TicketDelegate.h" @class Boy;@interface Gril : NSObject// “女孩”想去買電影票 - (void)buyTicket;// “女孩”聲明自己的代理對(duì)象為任意對(duì)象 但是對(duì)象必須遵守TicketDelegate協(xié)議 @property (nonatomic,retain) id<TicketDelegate> delegate; // 這樣的話 任何對(duì)象都可以作為代理對(duì)象 只要遵守協(xié)議即可@end /*********************************** Gril.m *************************************/ #import "Gril.h" #import "Boy.h"@implementation Gril// “女孩”想買電影票 - (void)buyTicket {// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 剩余電影票的個(gè)數(shù)int count = [_delegate leftTicketsCount];// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 單張電影票的價(jià)格double price = [_delegate ticketPrice];// 輸出女孩獲得的信息NSLog(@"還剩%d張電影票,每張票價(jià)是%.2f元",count,price);}// Girl類引用了Boy類 那么在Girl類釋放之前先釋放Boy對(duì)象 - (void)dealloc {[_delegate release];[super dealloc]; } @end // 定義協(xié)議/***************************** TicketDelegate.h文件 ******************************/ #import <Foundation/Foundation.h>// 定義協(xié)議:那么代理對(duì)象必須要遵循協(xié)議@protocol TicketDelegate <NSObject> // 查詢單張票價(jià) - (double)ticketPrice; // 查詢還剩多少張電影票 - (int)leftTicketsCount; @end /*********************************** Boy.h *************************************/ #import <Foundation/Foundation.h> #import "TicketDelegate.h"// 聲明代理對(duì)象要遵守的協(xié)議 @protocol TicketDelegate;// Boy作為Gril的代理則必須遵守協(xié)議 @interface Boy : NSObject <TicketDelegate>@end /*********************************** Boy.m *************************************/ #import "Boy.h" @implementation Boy// 實(shí)現(xiàn)單張票價(jià)的查詢 - (double)ticketPrice {return 20; }// 實(shí)現(xiàn)剩余的電影票 - (int)leftTicketsCount {return 3; } @end /*********************************** main.m *************************************/ #import <Foundation/Foundation.h> #import "Boy.h" #import "Gril.h" int main(int argc, const char * argv[]) {@autoreleasepool {Gril *gril = [[[Gril alloc] init] autorelease];Boy *boy = [[[Boy alloc] init] autorelease];// 為girl中的boy屬性賦值 完成“代理思想”gril.delegate = boy; // gril.delegate = boy; [gril buyTicket];}return 0; }
小結(jié):修改后的代碼耦合性相對(duì)來比較弱!假設(shè)如果再要為Gril類添加代理對(duì)象,Gril類本身不需要任何修改,只要新建的代理對(duì)象遵守協(xié)議即可
?
2.聯(lián)想U(xiǎn)ITableView要顯示內(nèi)容時(shí)它本身并不知道要顯示要分幾組、每組顯示多少行、每行顯示的內(nèi)容等,也是要依靠它的代理對(duì)象UITableViewDataSource來執(zhí)行返回的結(jié)果會(huì)賦值給UITableView中的相應(yīng)參數(shù),才會(huì)進(jìn)行顯示
?
轉(zhuǎn)載于:https://www.cnblogs.com/QM80/p/3624635.html
總結(jié)
以上是生活随笔為你收集整理的iOS 层层推进实现代理模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦里梦到老鼠是什么意思
- 下一篇: 事务与锁机制