C++模拟实现Objective-C协议和代理模式
Objective-C的協議和代理是運用最多的特性之一,可以說在蘋果系列開發中無處不在。事實上很多人都不知道其背后的原理。事實上簡單點說,這就是設計模式中的代理模式的經典運用。代理模式簡單點說就是為其他對象提供一種代理以控制對這個對象的訪問,而在OC當中形象點說就是如果A完成一件事,但是自己不能完成,于是他找個代理人B 替他完成這個事情,他們之間便有個協議 (protocol),B繼承該協議來完成A代理給他的事情。
舉個例子:有一個嬰兒,他本身不會自己吃飯和洗澡等等一些事情,于是嬰兒就請了一個保姆,于是嬰兒和保姆之間商定了一個協議,協議中寫明了保姆需要做什么事情, 而保姆就是這個代理人,? 即:嬰兒和保姆之間有個協議,保姆繼承該協議,于是保姆就需要實現該協議中的條款成為代理人。
那么回到Objective-C,舉一個很簡單的例子,tableview是運用最多的控件之一,其用法相信每一個做ios開發的童鞋都很清楚。其實這也是一個代理委托的經典運用。
首先初始化tableview控件,并且指定好代理和委托
_tableview = [[UITableView alloc] init]; [_tableview setDelegate:self]; [_tableview setDataSource:self]; [self.view addSubview:_tableview];_data = [[NSMutableArray alloc] initWithObjects:@"中國", @"美國", @"英國", nil];真正要把數據顯示到界面上的時候,其實只需要重載下面這個函數就可以了
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
至于為什么會調用到tableView這個函數上面,開發者完全不用關心。并且獲取data中數據個人等等,這些都不需要自己去做。回到最初舉得例子,其實tableview就相當一個嬰兒,他根本不會把數據畫到界面上去,于是他找了一個保姆做代理,就是主界面。主界面繼承并且實現了這個協議(其實協議就是tableView函數)來玩成整個系列功能。
如果用C++來模擬實現,其簡單代碼可以如下所示:
// proxyproj.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include <stdio.h> #include <Windows.h>class NSObject { public:virtual void callfun(){}virtual void tableview(int nShow){}NSObject *delegate; };DWORD WINAPI UIViewControlerThreadProc(LPVOID lpParam) {//do something//...... NSObject *pSelf = (NSObject *)lpParam;pSelf->delegate->tableview(100);return 0; }DWORD WINAPI proxyThreadProc(LPVOID lpParam) {//do something//...... NSObject *pSelf = (NSObject *)lpParam;pSelf->callfun();return 0; }class proxy : public NSObject { public:virtual void callfun(){CloseHandle(CreateThread(NULL,0,proxyThreadProc,this,0,NULL));} };class TableView : public proxy {};class UIViewControler : public proxy { public:void init(){TableView *tabView = new TableView;tabView->delegate = this;CloseHandle(CreateThread(NULL,0,UIViewControlerThreadProc,tabView,0,NULL));}void tableview(int nShow){ printf("Show Number %d \n",nShow);} };int _tmain(int argc, _TCHAR* argv[]) {UIViewControler ui;ui.init();getchar();return 0; }?
UIViewControler就相當于主界面,init就是初始化過程。在其中為TableView初始化代理,然后通過代理回調到tableview函數內部。而作為主界面方,只需要重載tableview函數即可,根本不需要關心內部實現。
轉載于:https://www.cnblogs.com/mod109/p/5743626.html
總結
以上是生活随笔為你收集整理的C++模拟实现Objective-C协议和代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RequireJS 主要函数
- 下一篇: Map集合中的一些具体方法的体现