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();
return ;
} DWORD WINAPI proxyThreadProc(LPVOID lpParam)
{
//do something
//...... NSObject *pSelf = (NSObject *)lpParam;
pSelf->callfun();
return ;
} class proxy : public NSObject
{
public:
virtual void callfun()
{
CloseHandle(CreateThread(NULL,,proxyThreadProc,this,,NULL));
}
}; class TableView : public proxy
{ }; class UIViewControler : public proxy
{
public:
void init()
{
TableView *tabView = new TableView;
tabView->delegate = this;
CloseHandle(CreateThread(NULL,,UIViewControlerThreadProc,tabView,,NULL));
}
void tableview(int nShow){ printf("Show Number %d \n",nShow);}
}; int _tmain(int argc, _TCHAR* argv[])
{
UIViewControler ui;
ui.init();
getchar();
return ;
}

UIViewControler就相当于主界面,init就是初始化过程。在其中为TableView初始化代理,然后通过代理回调到tableview函数内部。而作为主界面方,只需要重载tableview函数即可,根本不需要关心内部实现。

C++模拟实现Objective-C协议和代理模式的更多相关文章

  1. Objective-C:模拟按钮点击事件理解代理模式

    OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...

  2. 黑马程序猿_ 利用oc的协议实现代理模式

    先说下代理模式是什么吧 定义: 为其它对象提供一种代理以控制对这个对象的訪问.在某些情况下,一个对象不适合或者不能直接引用还有一个对象 而代理对象能够在client和目标对象之间起到中介的作用. 在看 ...

  3. 【转】fiddler-http协议调试代理工具

    题目有一些激进.但是在前端界打滚了这么多年,fiddler一直都是陪着我走过来了.它就是一个抓包神奇,代理神器.它的厉害之处,我简单地说一下,希望你们看了以后,能点上32个赞. 1.fiddler为何 ...

  4. 基于UDP协议模拟的一个TCP协议传输系统

    TCP协议以可靠性出名,这其中包括三次握手建立连接,流控制和拥塞控制等技术.详细介绍如下: 1. TCP协议将需要发送的数据分割成数据块.数据块大小是通过MSS(maximum segment siz ...

  5. OC第九节——协议与代理

    一.理解协议与代理 协议: 协议就是需要相互遵守的约定.规范:需要去实现协议中规定的方法. 代理: 代理是一个概念,很难用一个名词去定义(如我们可以说协议其实就是一个方法列表).它更像是一种关系,我要 ...

  6. HTTP协议 (五) 代理

    HTTP协议 (五) 代理 阅读目录 什么是代理服务器 Fiddler就是个典型的代理 代理作用一:FQ 代理作用二:匿名访问 代理作用三:通过代理上网 代理作用四:通过代理缓存,加快上网速度 代理作 ...

  7. 重学 Java 设计模式:实战代理模式「模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 难以跨越的瓶颈期,把你拿捏滴死死的! 编程开发学习过程中遇到的瓶颈期,往往是由于看不 ...

  8. Socks协议以及代理转发工具分析

    前言:最近两场HW都和某师傅学到了挺多东西,算是对内网不出网以及流量代理做个分析(SOCKS协议,reGeorg原理分析,frp的代理,CS上的代理 SOCKS SOCKS(Socks:Protoco ...

  9. 设计模式(十三):从“FQ”中来认识代理模式(Proxy Pattern)

    我们知道Google早就被墙了,所以FQ才能访问Google呢,这个“FQ”的过程就是一个代理的过程.“代理模式”在之前的博客中不止一次的提及过,之前的委托回调就是代理模式的具体应用.今天我们就从“F ...

随机推荐

  1. Android 7.0 IMS框架详解

    本文主要讲解IP Multimedia Subsystem (IMS)在Android 7.0上由谷歌Android实现的部分内容.从APP侧一直到Telephony Framework,是不区分CS ...

  2. 20140319 const sizeof define 编译时分配内存

    1.面试宝典预处理,const,sizeof Define作用定义函数: //用一个宏定义FIND求一个结构体struc里某个变量相对于struc的偏移量,如FIND(student,a)//等于0 ...

  3. this.$router.go()和this.$router.push()的差别

    1.this.$router.go(val) => 在history记录中前进或者后退val步,当val为0时刷新当前页面. 2.this.$router.push(path) => 在h ...

  4. 22-MySQL-Ubuntu-备份与恢复

    案例: 将数据库jing_dong_1的数据库备份,然后恢复到数据库jing_dong_2; 步骤如下: 1.备份 注意: mysqldump 不是 mysql; 尖括号的方向; python.sql ...

  5. Codeforces 479【D】div3

    题目链接:http://codeforces.com/problemset/problem/977/D 题意:给你一个数字序列,定了一个游戏规则.你可以对当前数字进行两个操作 1./ 3  如果这个数 ...

  6. Linux-iptables-route-rule

    详情: http://www.mamicode.com/info-detail-1412618.html  最后面有粘贴 linux系统路由表 linux一共0-255个路由表 linux可以自定义从 ...

  7. IdentityServer_0_参考资料

    官方 项目地址:https://github.com/IdentityServer/IdentityServer4 官方Demo:https://github.com/IdentityServer/I ...

  8. thinkphp 自动加载

    在3.2中,基本上无需手动加载类库文件,你可以很方便的完成自动加载. 命名空间自动加载 系统可以通过类的命名空间自动定位到类库文件,例如: 我们定义了一个类 Org\Util\Auth 类: name ...

  9. JS while 循环

    while循环:只要条件成立,就重复不断的执行循环体代码 while(条件判断) { 如果条件为true,则执行循环体代码 } while循环结构说明:   在循环开始前,必须要对变量初始化(声明变量 ...

  10. 使用串口绘制实时曲线 —— SerialChart

    SerialChart:下载 1. 实验效果 2. 串口程序 ){ ){ y = ; x = ; } ) y++; else y--; z = sin(x*Pi/); p = cos(x*Pi/); ...