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协议和代理模式相关推荐

  1. 简单的协议应用-代理模式

    协议(protocol): <> 遵守某个协议,只要遵守了这个协议,相当于拥有协议里面的所有方法声明 声明一系列方法 编译器不强求实现协议里所有的方法 分类和协议都只能声明方法,不能声明成 ...

  2. 第07课:生活中的代理模式——帮我拿一下快递

    用程序来模拟生活 从剧情中思考代理模式 代理模式的模型抽象 代码框架 类图 基于框架的实现 模型说明 代理模式的优点 代理模式的缺点 应用场景 [故事剧情] 八月中秋已过,冬天急速飞来--一场秋雨一场 ...

  3. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  4. swift 用协议实现代理传值功能

    2019独角兽企业重金招聘Python工程师标准>>> swift 用协议实现代理传值功能 原文  http://blog.csdn.net/whzhaochao/article/d ...

  5. 设置git协议clone代理

    0x0 最近在clone yaffs2仓库时发现clone的异常缓慢,就算开了代理也是,搜索一番发现网上大多都是将设置http.https.ssh协议的代理,对于git协定的代理讲的很少,下面分享下如 ...

  6. iOS开发篇——OC 协议和代理设计模式介绍

    蓝鸥iOS培训讲师推荐:好久没和大家沟通了,没和大家沟通了,今天就和大家说说有关OC内容协议和代理设计模式.首先要讲的是协议 一.协议 OC中的协议和接口有些相似,协议中定义的方法,在类中实现.协议一 ...

  7. windows Nginx WebSocket ws协议反向代理

    Nginx WebSocket ws协议反向代理 正常连接WebSocket 使用Nginx反向代理 正常连接WebSocket 未使用nginx反向代理 var ws = new WebSocket ...

  8. Python:模拟登陆与HTTP协议(1)

    编程悬崖,回头是岸 --Python:模拟登陆与HTTP协议(1) 最近快船可谓风生水起,现在是14胜3负排西部第二,西决地板的魔咒有望破解.东部毫无疑问是骑士的了,就看西部的马刺勇士快船谁能笑到最后 ...

  9. 使用观察者模式、代理模式、模板方法模式模拟QQ发空间,可以给好友设置昵称、给自己的空间设置访问权限

    import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date;public class Cl ...

最新文章

  1. Y Combinator
  2. java double 小数点后两位小数_Java中double类型的数据精确到小数点后两位
  3. 关于.net项目从vs2003升级到2005的若干问题
  4. BootStrap的入门和响应式的使用
  5. 【区块链之菜鸟入门】区块链发展史:从拜占庭将军问题到智慧契约
  6. python库skimage 绘制二值图像的凸壳
  7. sqlserver设计视图修改表时不允许保存更改的问题处理
  8. macOs 10.12.2总于修复鼠标驱动了
  9. 如何为Safari浏览器安装Flash插件?
  10. 2010~2011手机CPU对比
  11. oracle wip 资源吸收,Oracle ERP系统借贷关系
  12. 极客创新大赛|微创机器人号探索飞船即将启航
  13. 呼叫中心客服人员的秘密生活:同理心永远不会让你遭殃
  14. 快手春节红包背后,高并发存储架构设计
  15. uniapp获取通知栏内容 监听通知栏信息
  16. 算法详解之狄克斯特拉算法
  17. macOS 安装 brew步骤
  18. JAVA微信公众号推送信息
  19. sap进阶系列(14):第一篇:财务总览之合并会计报表(1)
  20. 数据分析-主成分分析流程(R语言)

热门文章

  1. Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)
  2. POJ 3061 -- Subsequence(二分)
  3. pygame用精灵编组的问题的猜想和验证(未完待续)
  4. c++ namespace和linux namespace
  5. SQL数据更新/删除
  6. [Jarvis OJ - PWN]——Smashes
  7. 置换怎么表示成轮换_§2.3 置换群
  8. c++11-Variadic Templates
  9. linux中的shell脚本case,【shell】Linux shell 之 case 详解
  10. php从mysql资源类型_php从mysql里读出来的数据默认什么类型?