• 使用场合
  • 使用步骤
  • 不使用protocol实现代理
  • 使用protocol实现代理

一、使用场合

  1. A想让B帮忙,就让B代理
  2. A想通知B发生了一些事情,或者传一些数据给B
  3. 观察者模式

二、使用步骤

  1. 定义一份协议
  2. B遵循协议,并且实现相应的方法
  3. A中定义一个代理属性:id <协议> delegate
  4. 创建B对象,将其附值给A的delegate属性

三、不使用protocol实现代理

首先不使用protocol来实现,这样就可以更好的对比:代理到底有什么好的。

项目中使用到的类

我们现在想让护士来照看孩子,如果孩子出现哭、吃、睡等行为时,护士立马相应,并且做出相应的动作

Baby.h

//
//  Baby.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Cocoa/Cocoa.h>
@class Nurse;@interface Baby : NSObject@property (nonatomic, assign) int age;
@property (nonatomic, retain) Nurse *nurse;-(void)cry;
-(void)eat;
-(void)sleep;@end

Baby.m

//
//  Baby.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Baby.h"
#import "Nurse.h"@implementation Baby-(void)cry
{NSLog(@"%d is crying", _age);[_nurse cry:self];
}
-(void)eat
{NSLog(@"%d is hugry", _age);[_nurse eat:self];
}
-(void)sleep
{NSLog(@"%d is sleep", _age);[_nurse sleep:self];
}@end

Nurse.h

//
//  Nurse.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Baby;@interface Nurse : NSObject-(void)cry:(Baby*) bady;
-(void)eat:(Baby*) bady;
-(void)sleep:(Baby*) bady;@end

Nurse.m

//
//  Nurse.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Nurse.h"@implementation Nurse-(void)cry
{NSLog(@"哄孩子");
}
-(void)eat
{NSLog(@"喂孩子");
}
-(void)sleep
{NSLog(@"让孩子睡觉");
}@end

main.m

//
//  main.m
//  01-代理模式2
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"int main(int argc, const char * argv[])
{@autoreleasepool {Nurse *nurse = [[Nurse alloc] init];Baby *baby = [[Baby alloc] init];baby.nurse = nurse;[baby cry];}return 0;
}

似乎这样的实现,并没有什么问题,但是如果有一天,护士突然不照护孩子了,我们将孩子交给一个老师来照料,是不是很多内容还改?

甚至有一天老师也不照料了,我们给孩子的爷爷奶奶来照料,又需要改很多内容

所以,我们可以使用protocol来实现

四、使用protocol实现代理

1⃣️我们先定义一份协议

//
//  LookBaby.h
//  01-代理模式3
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
@class Baby;@protocol LookBaby <NSObject>-(void)cry:(Baby*) baby;
-(void)eat:(Baby*) baby;
-(void)sleep:(Baby*) baby;@end

2⃣️Nurse遵循协议,且实现协议中的方法

.h

//
//  Nurse.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "LookBaby.h"
@class Baby;@interface Nurse : NSObject <LookBaby>@end

.m

//
//  Nurse.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Nurse.h"@implementation Nurse-(void)cry:(Baby*)baby
{NSLog(@"哄孩子");
}
-(void)eat:(Baby*)baby
{NSLog(@"喂孩子");
}
-(void)sleep:(Baby *)baby
{NSLog(@"哄孩子睡觉");
}@end

3⃣️Baby定义一个实现协议的属性

.h

//
//  Baby.h
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Cocoa/Cocoa.h>
#import "LookBaby.h"
@class Nurse;@interface Baby : NSObject@property (nonatomic, assign) int age;
@property (nonatomic, retain) id <LookBaby> loolBaby;-(void)cry;
-(void)eat;
-(void)sleep;@end

.m

//
//  Baby.m
//  01-代理模式
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import "Baby.h"
#import "Nurse.h"@implementation Baby-(void)cry
{NSLog(@"%d is crying", _age);[_loolBaby cry:self];
}
-(void)eat
{NSLog(@"%d is hugry", _age);[_loolBaby eat:self];
}
-(void)sleep
{NSLog(@"%d is sleep", _age);[_loolBaby sleep:self];
}@end

4⃣️创建B对象,设置A的delegate属性为B对象

//
//  main.m
//  01-代理模式3
//
//  Created by apple on 14-4-2.
//  Copyright (c) 2014年 apple. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Nurse.h"int main(int argc, const char * argv[])
{@autoreleasepool {Nurse *nurse = [[Nurse alloc] init];Baby *baby = [[Baby alloc] init];baby.loolBaby = nurse;baby.age = 10;[baby eat];}return 0;
}

转载于:https://www.cnblogs.com/letougaozao/p/3640403.html

设计模式之Protocol实现代理模式相关推荐

  1. 设计模式(四)--代理模式

    设计模式(四)–代理模式 文章目录 设计模式(四)--代理模式 其他链接 代理模式 1.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...

  2. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  3. 【设计模式与体系结构】代理模式

    [设计模式与体系结构]代理模式 文章目录 [设计模式与体系结构]代理模式 一.实例分析 二.代码实现 三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序. 要求:房产中介有介绍和代 ...

  4. 设计模式学习之1—代理模式

    设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...

  5. 《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回

    通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) 文章目录 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) @[toc] 一.单例模式 1. 相关概念 2. 演示思路 3. ...

  6. 设计模式笔记15:代理模式(Proxy Pattern)

    一.代理模式的内容        代理模式为另一个对象提供一个替身或占位符以访问这个对象.         给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...

  7. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来 ...

  8. Java设计模式(13)----------代理模式

    原文:https://www.imooc.com/article/24850 默课道可工程师学习地址:https://www.imooc.com/article/24850 介绍 代理模式中,在客户端 ...

  9. 设计模式笔记十三:代理模式

    原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 代理模式(Proxy Pattern): 一个类代表另一个类的功能.这种 ...

最新文章

  1. 5g局域网传输速度_这个路由太牛了吧?,三步搭建局域网,接上U盘就是NAS
  2. 安卓开发中RelativeLayout中的各个属性
  3. jQuery工作原理解析以及源代码示例
  4. angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍
  5. POJ 1007 DNA Sorting
  6. Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
  7. Java注解全面解析
  8. Linux 系统如何调整时区和时间
  9. 关于python多线程和定时器 看图不说话
  10. 感知机算法python实现
  11. 【网络流24题】【LOJ6000】搭配飞行员(二分图最大匹配,最大流Dinic)
  12. 华为平板鸿蒙发布,华为将发布鸿蒙平板,你期待吗?
  13. 第三章(循环) 编程题 2
  14. 浏览器限制html5 audio.play()自动播放的问题
  15. 微信小程序uniapp实现小图标转成SVN代码
  16. 6自由度机械臂建模与仿真
  17. adb shell命令抓包
  18. 计算机excel中钱的符号,在excel中输入钱的符号
  19. excel清单数据导入到开票软件中进行开票
  20. 计算机房屋出租系统毕业设计选题意义的说明

热门文章

  1. 中小型企业开展网站关键词优化,怎样才能达到理想优化效果?
  2. hessian java php_探讨Hessian在PHP中的使用分析
  3. python开发web运维工具_【实战小项目】python开发自动化运维工具--批量操作主机...
  4. android 第三方加密软件,Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发...
  5. vim-commentary 插件用法
  6. 在Ubuntu下进行安卓开发遇到“insufficient permissions for device: user in plugdev group; ”问题的解决办法
  7. 开发日记-20190508 关键词 dagger Idea插件
  8. flutter学习(排雷)一
  9. cordova:Error: Cannot find module '../cordova/platform_metadata'
  10. Linux基础-6性能监控