协议,委托与代理

原创 2016年05月30日 15:52:08

一.协议

1.定义:

OC或者iOS中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法

2.协议创建的步骤

  • 制定协议的内容(方法声明列表)
  • 遵守协议(.h)
  • 实现协议中的方法(.m)
  • 调用协议中的方法

3.声明协议的关键字

(1)@required

表示必须实现的方法(默认)

(2)@optional

表示可以实现也可以不实现的方法

4.双向协议

程序举例
(1)ProtocolManToWoman.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolManToWoman <NSObject>//基协议

- (void)white;
- (void)rich;
- (void)beautiful;

@optional
- (void)writeCode;

@end

(2)ProtocolWomanToMan.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolWomanToMan <NSObject>

@required
- (void)height;
- (void)rich;
- (void)handsome;

@optional
- (void)writeCode;

@end

(3)Man.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToMan.h"
@interface Man : NSObject <ProtocolToMan>

- (void)height;
- (void)rich;
- (void)handsome;
//- (void)writeCode;
@end

(4)Man.m文件

#import "Man.h"

@implementation Man

- (void)height{
    NSLog(@"I am so high....");
}

- (void)rich{
    NSLog(@"I am so rich....");
}

- (void)handsome{
    NSLog(@"I am very handsome...");
}

//- (void)writeCode{
//    NSLog(@"write hello world!....");
//}

@end

(5)Woman.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToWoman.h"
@interface Woman : NSObject <ProtocolToWoman>

- (void)white;
- (void)rich;
- (void)beautiful;

//- (void)writeCode;

@end

(6)Woman.m文件

#import "Woman.h"

@implementation Woman

- (void)white{
    NSLog(@"white.....");
}

- (void)rich{
    NSLog(@"rich.....");
}

- (void)beautiful{
    NSLog(@"beautiful......");
}

//- (void)writeCode{
//    NSLog(@"writting code....");
//}
@end

(7)main文件

#import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Man *man = [[Man alloc]init];
        if ([man respondsToSelector:@selector(height)]) {
            [man height];
        }
        if ([man respondsToSelector:@selector(rich)]) {
            [man rich];
        }
        if ([man respondsToSelector:@selector(handsome)]) {
            [man handsome];
        }
        if ([man respondsToSelector:@selector(writeCode)]) {
            [man writeCode];
        }
        else{
            NSLog(@"can not write code");
        }

        Woman *woman = [[Woman alloc]init];
        if ([woman respondsToSelector:@selector(white)]) {
            [woman white];
        }
        if ([woman respondsToSelector:@selector(rich)]) {
            [woman rich];
        }
        if ([woman respondsToSelector:@selector(beautiful)]) {
            [woman beautiful];
        }
        if ([woman respondsToSelector:@selector(writeCode)]) {
            [woman writeCode];
        }

    }
    return 0;
}

二.委托与代理

委托代理与正向传值程序举例
(1)ProtocolBossToWorker.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolBossToWorker <NSObject>

- (void)driveCar:(int)time;

@end

(2)ProtocolWorkerToBoss文件

#import <Foundation/Foundation.h>

@protocol ProtocolWorkerToBoss <NSObject>

- (void)payMoney:(int)money;

@end

(3)Boss.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Boss : NSObject<ProtocolWorkerToBoss>

@property (retain,nonatomic)id <ProtocolBossToWorker>agent;
@property (assign,nonatomic)int timeOfDrive;

- (void)payMoney:(int)money;

- (void)getDrive;

@end

(4)Boss.m文件

#import "Boss.h"

@implementation Boss

- (void)payMoney:(int)money{
    NSLog(@"boss pay the money %d",money);
}

- (void)getDrive{
    if ([self.agent respondsToSelector:@selector(driveCar:)]) {
        [self.agent driveCar:_timeOfDrive];
    }
}

@end

(5)Worker.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Worker : NSObject<ProtocolBossToWorker>

@property (retain,nonatomic)id <ProtocolWorkerToBoss>agent;
@property (assign,nonatomic)int money;

- (void)driveCar:(int)time;

- (void)getPay;
@end

(6)Worker.m文件

#import "Worker.h"

@implementation Worker

- (void)driveCar:(int)time{
    NSLog(@"drive for %d hours",time);
    _money = time*5;
}

- (void)getPay{
    if ([self.agent respondsToSelector:@selector(payMoney:)]) {
        [self.agent payMoney:_money];
//        [self.agent payMoney:[self driveCar:self.boss.timeOfDrive]];
    }
}
@end

(7)main.m文件

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Boss *boss = [[Boss alloc]init];
        Worker *worker = [[Worker alloc]init];
        boss.agent = worker;
        boss.timeOfDrive = 100;
        worker.agent = boss;
        [boss getDrive];
        [worker getPay];
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS 委托和协议区别和联系

IOS上的协议类似于C#、Java上面的接口,他是从类中抽出来的一系列方法,但方法的实现是在实现这个协议的类中,任何实现这个协议的类都需要实现协议类中的@require方法; 委托是一种设计模式...
  • jiajiayouba
  • jiajiayouba
  • 2014年03月12日 17:32
  • 4959

关于OC中委托(代理人)的理解

当遇到某些任务对象A需要但是不方便自己完成,而对象B正好可以胜任这些任务时,对象A把任务交给对象B去完成就变成最佳的选择,但是,对象A这时候并不认识对象B,所以就有了代理人的角色,对象A只需要把任务清...
  • qq_24570929
  • qq_24570929
  • 2015年11月10日 20:45
  • 726

Objc 协议以及委托 --个人理解

引子 为了弄明白委托和协议是什么东西以及怎么使用,我经常是隔三差五的在网上找资料来理解它。每次看完各种博客对于“委托和协议”的讲解,没过几天当我又看到“协议”、“委托“这两个关键词的时候,心里又产生...
  • ChSaDiN
  • ChSaDiN
  • 2014年08月06日 18:12
  • 4124

IOS学习之一个示例弄懂代理(delegate)和协议

协议在这里就像中间人的作用,没有这个中间人,就无法”受理代理”。注意代理和协议并不是总要一起实现,只是大部分情况下我们会用协议来辅助实现代理。...
  • pony_maggie
  • pony_maggie
  • 2014年05月12日 22:02
  • 35217

Swift 委托/代理设计模式

Swift 中的委托/代理模式(一下简称"代理模式")基本一致。 代理设计模式的基本思想就是将我(类或者结构体等)需要来完成的工作交给(委托给)另一个有我所规定的做这项工作能力的人(符合要求类型的对象...
  • lwjok2007
  • lwjok2007
  • 2015年08月29日 15:06
  • 4058

java中实现代理及委托代理模式

InvocationHandler 用于实现代理。如果不用InvocationHandler接口实现代理的话,我们写代码是这样的:定义一个接口:Java codeinterface Greet { ...
  • paincupid
  • paincupid
  • 2015年06月28日 21:54
  • 3079

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

先说下代理模式是什么吧 定义: 为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象 而代理对象可以在客户端和目标对象之间起到中介的作用。 在看...
  • chenchaoflight
  • chenchaoflight
  • 2014年06月17日 20:39
  • 9921

ios 代理和委托的区别

搜索之,看到了两篇文章,一时不能嚼透,留待日后细究。 代理(Proxy)和委派(Delegate)的区别 http://hi.baidu.com/thinkinginlamp/item/8b...
  • qq469236803
  • qq469236803
  • 2013年08月10日 11:06
  • 2083

iOS 委托代理(delegate)入门

**************************************************************                                     ...
  • yang8456211
  • yang8456211
  • 2013年09月10日 23:15
  • 5172

javascript-委托事件(事件代理)

委托事件
  • leonhuangjiajun
  • leonhuangjiajun
  • 2017年07月20日 20:16
  • 199
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:协议,委托与代理
举报原因:
原因补充:

(最多只允许输入30个字)