黑马程序员——有关protocol代理模式的举例说明

时间:2022-11-19 07:13:00

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