学习了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/

最新文章

  1. Java算法之字符串反转分析
  2. java父类与接口有相同的方法
  3. bootstrap-select去除蓝色边框outline
  4. CSS的压缩 方法与解压
  5. java操作FTP,实现文件上传下载删除操作
  6. android88 录音机
  7. HTML Jquery;marquee标签
  8. zoj3209(DLX)
  9. oracle_解锁表_解锁用户
  10. Oracle 表空间和用户权限管理【转】
  11. [POI2002][HAOI2007]反素数(Antiprime)
  12. Perl 正则匹配经验记录
  13. 10分钟看懂Docker和K8S
  14. c# base64编码解码
  15. VMware Workstation 14.1.1 精简特别版
  16. Flex外包公司——Flex案例展示
  17. 使用python比较两个文件的不同之处
  18. 安装MySQL遇到的常见英文翻译
  19. IDEA在编辑时提示could not autowire
  20. java ee思维导图

热门文章

  1. git使用(一)
  2. SGU 132 Another Chocolate Maniac 状态压缩DP
  3. PHP 投票练习
  4. 京东商城发现了一枚Bug
  5. Android 定制下拉刷新头部 Ultra Pull To Refresh
  6. Ubuntu下eclipse的Extjs提示插件安装
  7. Java异常 —— java.lang.NoClassDefFoundError
  8. Hibernate 异常 —— No CurrentSessionContext configured
  9. 终于成功仿了一次Kalman滤波器
  10. JavaScript高级程序设计之数据类型