设计模式之Protocol实现代理模式
- 使用场合
- 使用步骤
- 不使用protocol实现代理
- 使用protocol实现代理
一、使用场合
- A想让B帮忙,就让B代理
- A想通知B发生了一些事情,或者传一些数据给B
- 观察者模式
二、使用步骤
- 定义一份协议
- B遵循协议,并且实现相应的方法
- A中定义一个代理属性:id <协议> delegate
- 创建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.简介 2.静态代理 角色 代码实现 好处 3.动态代理 代码实现 解析 其他链接 JVM学习笔记(一) JVM学 ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
- 【设计模式与体系结构】代理模式
[设计模式与体系结构]代理模式 文章目录 [设计模式与体系结构]代理模式 一.实例分析 二.代码实现 三.实现结果 一.实例分析 (1) 代理模式设计一个房产中介的模拟程序. 要求:房产中介有介绍和代 ...
- 设计模式学习之1—代理模式
设计模式学习之1-代理模式 0.?先看这里 --- 诗雨的学习说明 1.从生活中初识代理 2.代理模式的类图和角色 3.静态代理和动态代理 4.静态代理 和 动态代理 的 使用模板 4.1 静态代理使 ...
- 《拉勾Java高薪课程》阶段一输出 之 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式)--菜鸟小回
通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) 文章目录 通过房屋租赁流程理解设计模式(单例模式,代理模式,工厂模式) @[toc] 一.单例模式 1. 相关概念 2. 演示思路 3. ...
- 设计模式笔记15:代理模式(Proxy Pattern)
一.代理模式的内容 代理模式为另一个对象提供一个替身或占位符以访问这个对象. 给某一个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式的英文叫做Proxy或Su ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来 ...
- Java设计模式(13)----------代理模式
原文:https://www.imooc.com/article/24850 默课道可工程师学习地址:https://www.imooc.com/article/24850 介绍 代理模式中,在客户端 ...
- 设计模式笔记十三:代理模式
原文:http://www.runoob.com/design-pattern/ 少许个人理解,如有错误请指出.欢迎一起讨论. 代理模式(Proxy Pattern): 一个类代表另一个类的功能.这种 ...
最新文章
- 5g局域网传输速度_这个路由太牛了吧?,三步搭建局域网,接上U盘就是NAS
- 安卓开发中RelativeLayout中的各个属性
- jQuery工作原理解析以及源代码示例
- angularjs全栈开发知乎_1-4【微信小程序全栈开发课程】原生小程序框架介绍
- POJ 1007 DNA Sorting
- Android Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
- Java注解全面解析
- Linux 系统如何调整时区和时间
- 关于python多线程和定时器 看图不说话
- 感知机算法python实现
- 【网络流24题】【LOJ6000】搭配飞行员(二分图最大匹配,最大流Dinic)
- 华为平板鸿蒙发布,华为将发布鸿蒙平板,你期待吗?
- 第三章(循环) 编程题 2
- 浏览器限制html5 audio.play()自动播放的问题
- 微信小程序uniapp实现小图标转成SVN代码
- 6自由度机械臂建模与仿真
- adb shell命令抓包
- 计算机excel中钱的符号,在excel中输入钱的符号
- excel清单数据导入到开票软件中进行开票
- 计算机房屋出租系统毕业设计选题意义的说明
热门文章
- 中小型企业开展网站关键词优化,怎样才能达到理想优化效果?
- hessian java php_探讨Hessian在PHP中的使用分析
- python开发web运维工具_【实战小项目】python开发自动化运维工具--批量操作主机...
- android 第三方加密软件,Android实用图文教程之代码混淆、第三方平台加固加密、渠道分发...
- vim-commentary 插件用法
- 在Ubuntu下进行安卓开发遇到“insufficient permissions for device: user in plugdev group; ”问题的解决办法
- 开发日记-20190508 关键词 dagger Idea插件
- flutter学习(排雷)一
- cordova:Error: Cannot find module '../cordova/platform_metadata'
- Linux基础-6性能监控