• 使用场合
  • 使用步骤
  • 不使用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 ;
}

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

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

所以,我们可以使用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实现代理模式的更多相关文章

  1. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  2. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

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

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

  4. Java设计模式系列之动态代理模式(转载)

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 代理模式示例代码 public interface Sub ...

  5. Java设计模式---(动态)代理模式

    代理设计模式 定义:为其他对象提供一种代理以控制对这个对象的访问. 动态代理使用 java动态代理机制以巧妙的方式实现了代理模式的设计理念. 之前虽然会用JDK的动态代理,但是有些问题却一直没有搞明白 ...

  6. 设计模式(十一)代理模式Proxy(结构型)

    1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供 ...

  7. javaScript 设计模式系列之三:代理模式

    介绍 代理模式为其他对象提供一种代理以控制对这个对象的访问. 根据代理模式的使用目的不同,代理模式又可以分为多种类型: 远程代理(Remote Proxy) 虚拟代理(Virtual Proxy)如需 ...

  8. python设计模式---结构型之代理模式

    主要想着nginx:) from abc import ABCMeta, abstractmethod # 结构型设计模式---代理模式 class Actor: def __init__(self) ...

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

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

随机推荐

  1. 洛谷P2947 [USACO09MAR]仰望Look Up

    P2947 [USACO09MAR]仰望Look Up 74通过 122提交 题目提供者洛谷OnlineJudge 标签USACO2009云端 难度普及/提高- 时空限制1s / 128MB 提交   ...

  2. Mysql 数据库备份工具 xtrabackup

    1.安装测试数据库mysql5.7 详细步骤 yum install -y gcc gcc-c++ cmake bison ncurses-devel .tar.gz cd mysql-/ cmake ...

  3. ios 瀑布流的那些事情

    转载: 屎壳郎情调-成长日记 首先要知道:瀑布流的核心就是要获取到图片的长宽 网上的很多例子都是加载本地图片的 对于新手而言 改成加载网络图片的确是有点压力的  因为本地的图片 我们是很容易就能获取到 ...

  4. FOJ Problem 2273 Triangles

    Problem 2273 Triangles Accept: 201    Submit: 661Time Limit: 1000 mSec    Memory Limit : 262144 KB P ...

  5. 网页内容切换效果实现的15个jQuery插件

    原文发布时间为:2010-02-01 -- 来源于本人的百度文章 [由搬家工具导入] http://www.webjx.com/javascript/jsajax-15550.html

  6. C#中的继承与覆盖

    原文发布时间为:2009-03-03 -- 来源于本人的百度文章 [由搬家工具导入] //using System;//using System.Collections.Generic;using S ...

  7. hdu 3549 Flow Problem 最大流 Dinic

    题目链接 题意 裸的最大流. 学习参考 http://www.cnblogs.com/SYCstudio/p/7260613.html Code #include <bits/stdc++.h& ...

  8. tomcat 多实例的Sys V风格脚本

    -------------------------------------------------[翠花,上脚本]------------------------------------------- ...

  9. POJ 2484 A Funny Game [博弈]

    题意:n枚硬币围成一个圈,每次每个人可以从中取走一枚或者相邻的两枚(如果两枚硬币原本中间隔着一枚硬币,后来被取走,这两枚硬币不算相邻).谁取走最后一枚硬币谁就赢了. 思路:我们可以找找规律. 首先,n ...

  10. bzoj 2889: Tree Conundrum

    2889: Tree Conundrum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 61  Solved: 37[Submit][Status][ ...