日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 层层推进实现代理模式

發布時間:2023/11/29 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 层层推进实现代理模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.代理模式核心思想:A類委托B類做某件事,然后A類獲取B類的執行的返回結果!

舉例:女孩想去買電影票,但是自己不親自去而是委托男孩了解電影電影票信息,同時女孩獲得男孩買票的結果,代碼模擬實現:

/*********************************** Gril.h *************************************/ #import <Foundation/Foundation.h> @class Boy; @interface Gril : NSObject// “女孩”想去買電影票 - (void)buyTicket;// “女孩”聲明自己的代理對象 @property (nonatomic,retain) Boy *boy; // @property (nonatomic,retain) Boy *delegate;@end /*********************************** Gril.m *************************************/ #import "Gril.h" #import "Boy.h"@implementation Gril// “女孩”想買電影票 - (void)buyTicket {// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 剩余電影票的個數int count = [_boy leftTicketsCount];// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 單張電影票的價格double price = [_boy ticketPrice];// 輸出女孩獲得的信息NSLog(@"還剩%d張電影票,每張票價是%.2f元",count,price);}// Girl類引用了Boy類 那么在Girl類釋放之前先釋放Boy對象 - (void)dealloc {[_boy release];[super dealloc]; } @end /*********************************** Boy.h *************************************/ #import <Foundation/Foundation.h>@interface Boy : NSObject// 查詢單張票價 - (double)ticketPrice; // 查詢還剩多少張電影票 - (int)leftTicketsCount;@end /*********************************** Boy.m *************************************/ #import "Boy.h" @implementation Boy// 實現單張票價的查詢 - (double)ticketPrice {return 20; }// 實現剩余的電影票 - (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; }

?小結:可以看出Gril類的代理對象已固定是Boy類,這樣的話代碼耦合性太強,如果下次需要修改Gril類的代理對象為其他對象則不便于修改

?修改后的代碼如下:

?

/*********************************** Gril.h *************************************/ #import <Foundation/Foundation.h> #import "TicketDelegate.h" @class Boy;@interface Gril : NSObject// “女孩”想去買電影票 - (void)buyTicket;// “女孩”聲明自己的代理對象為任意對象 但是對象必須遵守TicketDelegate協議 @property (nonatomic,retain) id<TicketDelegate> delegate; // 這樣的話 任何對象都可以作為代理對象 只要遵守協議即可@end /*********************************** Gril.m *************************************/ #import "Gril.h" #import "Boy.h"@implementation Gril// “女孩”想買電影票 - (void)buyTicket {// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 剩余電影票的個數int count = [_delegate leftTicketsCount];// “女孩”直接獲取自己的代理(“男孩”)的方法返回值 單張電影票的價格double price = [_delegate ticketPrice];// 輸出女孩獲得的信息NSLog(@"還剩%d張電影票,每張票價是%.2f元",count,price);}// Girl類引用了Boy類 那么在Girl類釋放之前先釋放Boy對象 - (void)dealloc {[_delegate release];[super dealloc]; } @end // 定義協議
/*
**************************** TicketDelegate.h文件 ******************************/ #import <Foundation/Foundation.h>// 定義協議:那么代理對象必須要遵循協議@protocol TicketDelegate <NSObject> // 查詢單張票價 - (double)ticketPrice; // 查詢還剩多少張電影票 - (int)leftTicketsCount; @end /*********************************** Boy.h *************************************/ #import <Foundation/Foundation.h> #import "TicketDelegate.h"// 聲明代理對象要遵守的協議 @protocol TicketDelegate;// Boy作為Gril的代理則必須遵守協議 @interface Boy : NSObject <TicketDelegate>@end /*********************************** Boy.m *************************************/ #import "Boy.h" @implementation Boy// 實現單張票價的查詢 - (double)ticketPrice {return 20; }// 實現剩余的電影票 - (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; }

小結:修改后的代碼耦合性相對來比較弱!假設如果再要為Gril類添加代理對象,Gril類本身不需要任何修改,只要新建的代理對象遵守協議即可

?

2.聯想UITableView要顯示內容時它本身并不知道要顯示要分幾組、每組顯示多少行、每行顯示的內容等,也是要依靠它的代理對象UITableViewDataSource來執行返回的結果會賦值給UITableView中的相應參數,才會進行顯示

?

轉載于:https://www.cnblogs.com/QM80/p/3624635.html

總結

以上是生活随笔為你收集整理的iOS 层层推进实现代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。