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函数即可,根本不需要关心内部实现。

时间: 2024-10-13 22:45:21

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

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

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用. 在看过李明杰老师的课程后,我对代理模式有了最初步的理解,虽然还很浅显 但是也明白了代理模式的 一些作用跟用法.首先使用代理模式可以降低耦合度.大大的增强了代码的弹性. 举个例子,小明想看电影,但是没时间买票 于是就拜托小强去买票 最简单的方式就是 建立一个person类(小明) 一个agent类(代理类) ag

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

OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须实现这个接口中声明的所有方法:但在OC中,可以不实现协议中声明的所有方法,需要用到某些功能,就去实现对应的方法即可. 这种模式一般称为代理模式.在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦. 监听思想:如果想让某个对

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

协议(protocol): <> 遵守某个协议,只要遵守了这个协议,相当于拥有协议里面的所有方法声明 声明一系列方法 编译器不强求实现协议里所有的方法 分类和协议都只能声明方法,不能声明成员变量 NSObject是基协议 假设一个人要买票,但是他没有空,需要一个代理去帮他问问票价多少啊,还有几张票啊~ 协议TicketDelegate.h,这里指代理所需要拥有的方法. // // TicketDelegate.h // 协议的应用-代理模式 // // Created by Mekor on

用协议实现代理模式

委托方要遵守代理,就要继承代理,并且要实现代理 /*1. 老板不定期的组织活动,每次都让小明统计参加活动的人数,小明每次将参加活动的人数上报给老板, 老板很高兴.*/ //main /*1. 老板不定期的组织活动,每次都让小明统计参加活动的人数,小明每次将参加活动的人数上报给老板, 老板很高兴.*/ #import <Foundation/Foundation.h>#import "Boss.h"#import "XiaoWang.h" int main

【IOS开发之Objective-C】协议和代理

在现实生活中我们存在各种各样的协议,但是都有一个共同点,就是拟定的协议,就要遵守,不遵守就是违约.在OC中也有协议这一个概念而且和我们现实生活中的协议的特点是类似的.有时我们自己想做什么事,但是现在没这个能力自己去做,亲力亲为,我们就需要找代理来帮我们做了.那么在OC中也有代理这个概念.下面就简单的说说OC中的协议和代理. 一.协议 在<[IOS开发之Objective-C]对象的交互>中实现了一种对象的交互的方式.在OC中还有其他方式,比如说协议,在OC中用协议来规范接口,是实现对象之间的交

iOS基础——浅谈个人对协议、代理的理解

阅读前的知识储备 请确保在阅读本文时,曾经不止一次亲自动手敲过有关代理模式的代码.如果没有,请在积累一定的经验后阅读,相信会更有收获.也希望大神不吝指教. 什么时候要用协议和代理? 下面举一个例子,谈谈个人对代理.协议的理解,希望能够起到抛砖引玉的效果. 假设现在有这么一个任务需求:页面A需要跳转到页面B(有可能会传入一些参数),页面B填写或者处理一些信息在跳转回页面A的同时还需要把数据返回A. 不要为了用代理模式而用代理模式 代理模式只是一种设计模式,它的价值在于通过一个统一的模式,解决一个原

swift详解之十一------------协议、委托(代理)模式

协议.委托(代理)模式 注:本小节总结协议以及依靠协议实现委托,这将在以后经常被使用.是一个非常重要的模块 看下官方的定义:协议定义了一个蓝图 , 规定了用来实现某一特定工作或者功能所必须的方法和属性,类.结构体.或者枚举类型都可以遵循协议, 并提供具体实现来完成协议定义的方法和功能 . 任意能够满足协议要求的类型都被成为遵循了这个协议 1.协议的语法 协议的关键字:protocol 协议的语法: protocol Pro1{ //这里定义属性或者方法 } 要使一个类或者结构体遵循某个协议 ,

不务正业 (1) —— 在应用层模拟实用停等协议

[总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 背景说明 本文章来源于近期需要提交的<计算机网络>课程实验. 实验分为3部分,分别需要在应用层模拟实用停等协议.连续ARQ协议和滑动窗口协议,实现文件的传输.端与端之间的通信使用Socket完成. 语言可以任选,出于简单,本文以java为例,仅介绍使用停等协议的实现,其他内容由同学们自己探索吧.强烈不推荐MFC,除非想把自己玩死. 注:本人上课睡觉时间远远长于听课时间,故不对文章的正确性

第七讲.NSDate,category(分类),extension(延展),protocol(协议),delegate(代理)

一.掌握NSDate和NSDateFormatter的使用 NSDate是Cocoa中?用于处理日期和时间的基础类,封装了某一给定的时刻(含日期,时间,时区). 了解NSDate的创建,如何计算当前时间,时间间隔,以及时间日期与字符之间的互转. 1>.NSDate创建,当地时间计算,时间按间隔计算,时间与字符之间的互转 练习题1:计算当前时间与一个固定时间按的时间差 练习二:字符串转化为日期对象 二.掌握Category的定义和使用(只能为类扩展类方法或实例方法) 1.主要作用是为:没有源代码的