黑马程序员——有关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"> ...
随机推荐
- USACO Section 3.3: A Game
第一次碰到博弈论题目,是很棘手,博弈论题目要考虑全局最优的解法,我第一次用了局部最优的,而且vector也没pop_front()操作.后来看了网上的用dp的方法解的. 博弈论的题目基本都得用dp法子 ...
- c# 计算1-100之间的所有整数的和
求1-100所有整数和: class Program { static void Main(string[] args) { ,); Console.WriteLine("1-100之间所有 ...
- Android 定制下拉刷新头部 Ultra Pull To Refresh
我们看到手机中的各种APP的花样繁多的下拉刷新是不是有点心动呢,想着自己定制自己的专门的下拉刷新,市场上比如,58同城,京东,天猫,美团等下拉刷新都是在下拉头部执行帧动画,我最近看到一个APP,就是慕 ...
- ArcGIS Engine中的8种数据访问
数据是GIS的基础, 访问数据也是进行任何复杂的空间分析及空间可视化表达的前提.ArcGIS支持的数据格式比较丰富,对不同的数据格式支持的程度也有很大差异.本文主要介绍一下以下八种数据格式在ArcGI ...
- jsp导出excel
很多时候,我们都知道在java项目里面采用poi来导出excel很方便,但是如果你的项目采用的是jsp你可以用更简单的方法来导出.首先你要在顶部引入:<jsp:directive.page im ...
- [原]武大预选赛F题-(裸并查集+下标离散化+floyd最短路)
Problem 1542 - F - Countries Time Limit: 1000MS Memory Limit: 65536KB Total Submit: 266 Accepted: 36 ...
- 每天一个小算法(Shell Sort2)
希尔排序: 伪代码: input: an array a of length n with array elements numbered 0 to n − 1 inc ← round(n/2) wh ...
- C#图片压缩的实现方法
一般在web应用中,对客户端提交上来的图片肯定需要进行压缩的.尤其是比较大的图片,如果不经过压缩会导致页面变的很大,打开速度比较慢,当然了如果是需要高质量的图片也得需要生产缩略图. 一般在web应用中 ...
- vs2015中安装EntityFramework
在项目上右键,然后选择Manage NuGet Packages 搜索EntityFramework,然后Install accept Attempting to gather dependencie ...
- 使用SqlTransaction回滚事务
https://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqltransaction(v=vs.110).aspx private ...