黑马程序员——有关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协议的理解造的。程序中可能会存在一些语言错误或是遗漏,还请斧正。

原文地址:https://www.cnblogs.com/newbee010/p/4347238.html