设计模式之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.还是老套路,先从名字上来看看.“代理”可以理 ...
随机推荐
- hihoCoder [Offer收割]编程练习赛83 D 生成树问题
题目 从 Kruskal 算法的角度来思考这个问题. 考虑 $n$ 个点的"空图"(即没有边的图). 先将 $m_2$ 条无权值的边加到图中,得到一个森林. 按边权从小到大的顺序枚 ...
- Mail.Ru Cup 2018 Round 2 Problem C Lucky Days
设在第 $x$ 天二人都 lucky,则有 $\DeclareMathOperator{\lcm}{lcm}$ $ x = y_a t_a + R_a $ $ x= y_b t_ b + R_b$ 约 ...
- Python之数据结构:序列
一.序列 1.列表.元组和字符串都是序列 二.序列的两个特点:索引操作符和切片操作符 1.索引操作符:从序列中抓取一个特定项目 下标操作:使用索引获取序列中的单个项目: eg:shoplist[0] ...
- envsetup.sh 与 choosecombo
choose: 来定义编译选项, choosecombo 将会一步一步提示你输入相应的编译参数 https://blog.csdn.net/kickxxx/article/details/692518 ...
- linux之awk手册
awk 手册 原文 Table of Contents 1. awk简介 2. awk命令格式和选项 2.1. awk的语法有两种形式 2.2. 命令选项 3. 模式和操作 3.1. 模式 3.2 ...
- SqlServer不允许更改字段类型(表中已有数据)
工具-选项-设计器-阻止保存要求重新创建表的更改,√去掉.
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---55
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---27
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- ATOM入坑必备插件
Atom作为Javascript/CSS/HTML等前端编辑器利器,其强大功能依靠各种插件,以下是笔者在入坑阶段,精挑细选总结出的必不可少的插件,熟悉运用这些插件,一定成吨提高生产效率.安装这些插件只 ...
- Light oj 1233 - Coin Change (III) (背包优化)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1233 题目就不说明了. 背包的二进制优化,比如10可以表示为1 2 4 3,而 ...