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

  • 相关阅读:
    每日一题:用一个SQL语句交换两条数据某一列的值
    String value(); String[] value(); 比较
    java.sql.SQLException: Unknown system variable 'tx_isolation'
    return; 用法
    Linux和UNIX的关系及区别(详解版)
    404
    Centos 7 修改YUM镜像源地址为阿里云镜像地址
    JVM面试必备
    秒杀优化迭代
    电商秒杀基础构建项目笔记2(优化效验准则和商品模型创建)
  • 原文地址:https://www.cnblogs.com/newbee010/p/4347238.html
Copyright © 2020-2023  润新知