黑马程序员——有关protocol代理模式的举例说明
学习了protocol协议的基本原理和使用方法之后 ,下面就看一下在程序中是怎么体现这种代理思想的。
假定有个人jack需要找一个厨师为自己做饭,当他想要吃饭的时候就可以让厨师给他做好饭。这一需求如何运用protocol代理设计模式解决呢?
分析思路:
首先jack应该有一个吃饭的方法,还拥有一个代理人的属性,并且要求这个代理人要会做饭。这就需要先拟一份协议声明做饭的方法。
只要有人遵守这个协议就可以成为jack的代理人为jack做饭。
下面就来试着编写一下这个程序,只是将框架列出,细节部分暂不实现。
1.在cook.h文件中列出协议并声明做饭的方法
CookMeal.h
#import<Foundation/Foundation.h>
@protocol cookMeal <NSObject>
- (int)cookMeal; //协议声明做饭方法
@end
2.创建一个Person类并在Person.h中遵守cookMeal协议
Person.h
#import<Foundation/Foundation.h>
@protocol cookMeal; //Person类遵守cookMeal协议
@interface Person:NSObject<cookMeal>
- (void)eat; //Person声明吃饭方法
@property (nonatomic,retain) id<cookMeal>cook;
@end
Person.m
#import"Person.h"
@implementation Person
- (void)eat //吃饭方法的实现
{
int n=[_cook cookMeal];//调用厨师的做饭方法
NSLog(@"今天做了%d道菜",n);
}
- (void)dealloc
{
[_cook release];
[super dealloc];
}
@end
3.上面已经创一个person类并拟定了一份名为CookMeal的protocol协议。
下面只要有一个类能遵守这个协议就可以成为jack的厨师为其做饭了。
Agent.h
#import <Foundation/Foundation.h>
#import"CookMeal.h" //Agent类遵守cookMeal协议
@interface Agent:NSObject<cookMeal>
@end
Agent.m
#import"Agen.h"
@implementatio Agent
- (int)cookMeal //Agent类对协议中做饭方法的实现\
{
return 4;
}
@end
4.上面Agent类遵守了cookMeal协议并实现了协议中的方法,因此就可以成jack的厨师。
main.,m
#import<Foundation/Foundation.h>
#import"Person.h"
#import"Agent.h"
int main()
{
@autoreleasepool{
Person*jack=[[Person allco]init]; //创建jack对象
Agent*cook1=[[Agent alloc]init]; //创建cook1对象
jack.cook=cook1; //将cook1给jack当厨师
[jack eat]; //jack调用吃饭方法,则要到person.m中找方法的实现。
[cook1 release];
[jack release];
}
return 0;
}
例子通过jack要吃饭调用其吃饭方法,找到厨师cook1,cook1再实现协议中的做饭方法,将做好的n道菜返回给jack。这就实现一次代理式的方法调用 。
这个例子是我对于protocol协议的理解造的。程序中可能会存在一些语言错误或是遗漏,还请斧正。
http://www.itheima.com/
黑马程序员——有关protocol代理模式的举例说明的更多相关文章
- 黑马程序员——有关protocol的小结
在OC程序中经常会有这样的问题就是一个类想让其他类帮自己实现某些方法,然后再将结果返回给这个类:如何让一个类要找的代理去实现自己想要的方法呢? 这样就需要有一个协议,让能遵守协议的其他类都能实现协议中 ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- 黑马程序员——【Java高新技术】——代理
---------- android培训.java培训.期待与您交流! ---------- 一.“代理概述”及“AOP概念” (一)代理概述 1.问题:要为已存在的多个具有相同接口的目标类的各个方法 ...
- 黑马程序员:3分钟带你读懂C/C++学习路线
随着互联网及互联网+深入蓬勃的发展,经过40余年的时间洗礼,C/C++俨然已成为一门贵族语言,出色的性能使之成为高级语言中的性能王者.而在今天,它又扮演着什么样重要的角色呢?请往下看: 后端服务器,移 ...
- 黑马程序员:Java基础总结----类加载器
黑马程序员:Java基础总结 类加载器 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...
- 黑马程序员:Java基础总结----正则表达式
黑马程序员:Java基础总结 正则表达式 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 正则表达式 import java.util.regex.*; 符合一定规 ...
- 黑马程序员面试宝典(Java)Beta6.0免费下载
场景 JavaSE基础 面向对象特征以及理解 访问权限修饰符区别 理解clone对象 JavaSE语法 java有没有goto语句 &和&&的区别 如何跳出当前的多重嵌套循环? ...
- 黑马程序员+SQL基础(上)
黑马程序员+SQL基础 ---------------<a href="http://edu.csdn.net"target="blank">ASP ...
- 黑马程序员+Winform基础(上)
黑马程序员+Winform基础 ---------------<a href="http://edu.csdn.net"target="blank"> ...
随机推荐
- dojo 一 require 路径问题
dojo.baseUrl baseUrl用来存储dojo.js存放 的跟目录,例如dojo.js的路径是“/web/scripts/dojo-1.3/dojo/dojo.js”则baseUrl为“/w ...
- NDK(0)简介
AndroidNDK Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”. 众所周知,Android程序运行 ...
- BZOJ 1016 星球大战starwar(逆向-并查集)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们 ...
- 【HDOJ】5446 Unknown Treasure
1. 题目描述题目很简单,就是求$C(n,m) % M$. 2. 基本思路这是一道应用了众多初等数论定理的题目,因为数据范围较大因此使用Lucas求$C(n,m) % P$.而M较大,因此通过$a[i ...
- apache for mac OX S 10.10
mac下如何针对 apache 设置虚拟目录呢?可能很多人都设置过,但也都不太会,每次都是网上找文章啥的.这里,我自己整理了一点,希望可以帮到大家. 还原 httpd.conf 配置文件 如果,你现在 ...
- 浅谈网络爬虫爬js动态加载网页(二)
没错,最后我还是使用了Selenium,去实现上一篇我所说的问题,别的没有试,只试了一下firefox的引擎,总体效果对我来说还是可以接受的. 继续昨天的话题,既然要实现上篇所说的问题,那么就需要一个 ...
- 基于Html5的爱情主题网站–表白神器(第二版)
第二版在第一版的基础上增加了一个动态3D的白云效果背景,鼠标悬浮在页面上云朵会向屏幕Z轴方向运动,在第一人称视角看来向着云朵方向前进的,由此形成一个伪3D效果.有点绕,直接看demo就能理解了.3D白 ...
- 每天一个Linux命令(2): ls
ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...
- 【英语】Bingo口语笔记(15) - Give系列
- 一起学CUDA(一)
前提是电脑的显卡支持CUDA,N卡一般是支持的,如果是A卡就没办法了.主要针对Windows环境,Linux和Mac也有相应的安装包.CUDA环境搭建:Step1:安装代码环境VS2010:Step2 ...