黑马程序员——有关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"> ...
随机推荐
- 自适应高度的 textarea
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间
package com.zrar.date; import java.util.Calendar; /** * * 描述:此类用于取得当前日期相对应的月初,月末,季初,季末,年初,年末,返回值均为St ...
- Java 异常 —— Bad version number in .class file
把一个项目拷贝到另一个环境,运行时报错: Caused by: java.lang.UnsupportedClassVersionError: Bad version number in .class ...
- HDU 1941 Hide and Seek(离散化+树状数组)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1941 题意:给出平面上n个点,找出一点p,使得距离p最近和最远的点的距离之差最小.输出这 ...
- Codis使用教程
1. Codis集群的搭建与使用 http://www.cnblogs.com/xuanzhi201111/p/4425194.html https://github.com/CodisLabs/co ...
- 无锁编程(一) - Double-checked Locking
Double-checked Locking,严格意义上来讲不属于无锁范畴,无论什么时候当临界区中的代码仅仅需要加锁一次,同时当其获取锁的时候必须是线程安全的,此时就可以利用 Double-che ...
- Machine Learning for hackers读书笔记_一句很重要的话
为了培养一个机器学习领域专家那样的直觉,最好的办法就是,对你遇到的每一个机器学习问题,把所有的算法试个遍,直到有一天,你凭直觉就知道某些算法行不通.
- 51nod1434 区间LCM
将n!标准分解.m!/n!必定需要包含n!的分解式.对于每个质数枚举最小的答案,然后总的取最大. #include<cstdio> #include<cstring> #inc ...
- IOS学习-报错误 Finishing up a navigation transition in an unexpected state. Navigation Bar subview tree might get corrupted.
环境:XCODE:5.0.2 IOS7模拟器 界面:使用storyboard 拖拽 简单应用:一个CoreData的CRUD用例. 界面如下图(一个UITableViewController 列表 ...
- PHP学习笔记02——简易计算器
<!DOCTYPE html> <html> <head> <title>PHP简易计算器</title> </head> &l ...