设计模式之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.还是老套路,先从名字上来看看.“代理”可以理 ...
随机推荐
- [SDOI2011][bzoj2245] 工作分配 [费用流]
题面 传送门 思路 数据范围n,m<=250 分配任务问题 这是典型的"看到数据范围就知道算法"类型 而且我们发现我们要保证一定产出的情况下最小化花费 这句话等价于保证一定流 ...
- 轮播图原生js实现和jquery实现和js面向对象方式实现
原生JS实现 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- Date()和new Date()区别
当任意一个普通函数用于创建一类对象时,它就被称作构造函数,或构造器. new操作符来调用一个构造函数时,创建一个空对象obj, 将这个空对象的__proto__成员指向了构造函数对象的prototyp ...
- input输入框与元素间有间隙
<div class="container"> <button>1</button> <button>2</button> ...
- C# Log日志工具类
using System; using System.Collections.Generic; using System.Text; using System.IO; public class Log ...
- Qualcomm MPM introduction
在 Qualcomm chip 裡有一個 hardware block 名為 MPM. 在 RPM CPU halts 後,MPM 會保持在 on 的狀態用來處理 全系統 sleep process ...
- hdu 2145(迪杰斯特拉)
zz's Mysterious Present Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- 将Map<String, List<Map<String,Object>>>进行排序
首先我贴上我的代码,刚开始我也不知道怎么排序还写了一些方法,最后请教群里的大神解决了 public Map<String, List<Map<String,Object>> ...
- 16Aspx.com-书通网中小学生免费在线学习网站源码 带采集带手机版帝国cms内核
=============================================== 源码站长资源交易专业网-商业源码下载,VIP源码,程序交易,毕业设计交易,站长交易|- 16aspx.c ...
- Kali Linux 2017中Scapy运行bug解决
Kali Linux 2017中Scapy运行bug解决 Scapy是一款强大的网络数据包构建工具.在Kali Linux 2017中,当在scapy的命令行中,运行res.graph()生成图形 ...