设计模式之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 ;
}
似乎这样的实现,并没有什么问题,但是如果有一天,护士突然不照护孩子了,我们将孩子交给一个老师来照料,是不是很多内容还改?
甚至有一天老师也不照料了,我们给孩子的爷爷奶奶来照料,又需要改很多内容
所以,我们可以使用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 = ; [baby eat]; }
return ;
}
设计模式之Protocol实现代理模式的更多相关文章
- 【转】设计模式(十一)代理模式Proxy(结构型)
设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- Java设计模式(10)代理模式(Proxy模式)
理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...
- Java设计模式系列之动态代理模式(转载)
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...
- Java设计模式---(动态)代理模式
代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白 ...
- 设计模式(十一)代理模式Proxy(结构型)
1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供 ...
- javaScript 设计模式系列之三:代理模式
介绍 代理模式为其他对象提供一种代理以控制对这个对象的访问. 根据代理模式的使用目的不同,代理模式又可以分为多种类型: 远程代理(Remote Proxy) 虚拟代理(Virtual Proxy)如需 ...
- python设计模式---结构型之代理模式
主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
随机推荐
- 个人环境搭建——搭建jenkins持续构建集成环境
---恢复内容开始--- 搭建jenkins持续构建集成环境 要搭建jenkins持续构建集成环境,首先要安装tomcat和JDK: 第一部分,基本说明: 敏捷(Agile) 在软件工程领域 ...
- 论文笔记《Fully Convolutional Networks for Semantic Segmentation》
一.Abstract 提出了一种end-to-end的做semantic segmentation的方法,也就是FCN,是我个人觉得非常厉害的一个方法. 二.亮点 1.提出了全卷积网络的概念,将Ale ...
- js 和 jquery的宽高
window 和 document : window 对象表示浏览器打开的窗口,可以省略 document对象(浏览器的html文档)是window对象的一部分 document.body等于wind ...
- bzoj 3277 串 后缀树+子树不同数个数
题目大意 给定\(n\)个字符串和\(k\) 对于每个字符串,输出它有多少个子串至少是\(k\)个字符串的子串(包括自己) 分析 建出广义后缀自动机 至少是\(k\)个字符串的子串就是求子树内不同数个 ...
- 学习 表单验证插件validate
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [LeetCode] Gas Station 贪心
There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...
- Berkeley DB使用SecondKey给数据排序的实现方法
Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法.它的官方示例和文档比较丰富,感觉比 ...
- enum枚举类型
枚举类型的实例是常量,且它们都用大写字母表示. 简单枚举例子: public enum Spiciness { NOT, MILD, MEDIUM, HOT, FLAMING } public cla ...
- Ubuntu FireFox的“后退”按钮与Backspace键
我们都知道,大部分的网页浏览器和窗口管理器的“后退”按钮是和Backspace键关联的,这样会极大的方便并加快我们浏览时的翻页速度(我一直是左手 放在键盘上按快捷键,右手鼠标的姿势找文件和看网页的,省 ...
- 复习FBV与CBV
在学习DRF之前~我们要先复习一些知识点~~ FBV和CBV 学习Django的时候~我们已经学习过了CBV以及FBV~~我们来复习一下~~ 什么是FBV和CBV呢~~ FBV 基于函数的视图 CBV ...