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. docker的常用命令汇总
  2. 如果沟通有范式,它会是怎么样子?
  3. mysql relay_技术分享 | MySQL:产生大量小 relay log 的故障一例
  4. php日期时间代码,PHP日期计算
  5. 数据库索引是什么?为什么要使用索引?
  6. Centos7通过oh-my-zsh安装powerlevel9k和powerlevel10k
  7. DTCC2019 中国数据库技术大会见证实录(PPT 下载,来了!)
  8. 数据库索引的填充因子
  9. 李学斌:论复杂系统中的应用间协作V3
  10. 数据集voc,coco注释格式,详情大全
  11. 拉斯姆森羽毛球教学视频11-27(文字版配图)
  12. linux服务器IP伪造,Linux服务器间同网段IP伪装端口映射
  13. 光和颜料中的三原色,美术中的三原色
  14. p37 p38 p39 p40 p41
  15. 翁凯java程序设计总结(基于C语言基础上)
  16. 参考文献中不同符号的含义
  17. 教你一波Lucas(卢卡斯)定理在数论解题中的应用
  18. 谈谈51单片机延时子程序
  19. 泰拉瑞亚加mod之后如何搭建服务器进行联机
  20. SeleniumLibrary4.5.0 关键字详解(五)

热门文章

  1. 计算机应用基础专科,2016电子科技大学计算机应用基础(专科)在线作业2
  2. fatal error C1070: mismatched wabtags.h
  3. php查询字段的总和,ThinkPHP 多表查询-如其字段A相同,则把字段B相加
  4. 对于Array的引用
  5. 读文件并返回其中最大最小行的shell脚本
  6. telnet命令详解
  7. amount describe
  8. 找到了一些很好的算法书和试题
  9. PHP面向对象(OOP)编程入门教程
  10. 《软件工程》课程设计总结