zoukankan      html  css  js  c++  java
  • Objective-c 代理模式(delegate)

    Objective-c 代理模式(delegate)

     (2012-07-31 22:04:39)
    标签: 

    杂谈

    分类: iOS
    Objective-c 代理模式(delegate)
     
      一、什么事代理模式?
            代理模式是在oc中经常遇到的一种设计模式,那什么叫做代理模式呢? 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情, 而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人。
     
    二、 代理模式的关键点:
         A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议 (protocol),B继承该协议来完成A代理给他的事情。 
     
    三、实例分析
        下面来举一个经典的实例,妈妈和保姆的例子:妈妈把孩子委托给保姆照顾,于是将需要完成的事情写成一个协议:协议声明如下:

    #import <Foundation/Foundation.h>

    @protocol Job <NSObject>

    -(void)takeEat;

    -(void)takeSleep;

    -(void)takePlay;

    -(void)takeShower;

    @end

    我们再声明Nurse类 即代理的人:

    #import <Foundation/Foundation.h>

    #import "Job.h"

    @interface Nurse : NSObject<Job>//实现该协议

    @end

    实现文件:

    #import "Nurse.h"

    @implementation Nurse

    -(void)takeEat

    {

        NSLog(@"小孩饿了,喂它吃饭");

    }

    -(void)takeSleep

    {

        NSLog(@"小孩困了,哄他睡觉");

    }

    -(void)takePlay

    {

        NSLog(@"小孩醒来了,陪他玩");

    }

    -(void)takeShower

    {

        NSLog(@"晚上给小孩洗澡");

    }

    -(void)dealloc

    {

        NSLog(@"Nurse is dealloc");

    }

    @end

    再声明一个morther类:

    #import <Foundation/Foundation.h>

    #import "Job.h"

    @class Nurse;

    @interface Morther : NSObject

    {

        NSString *name;

        id<Job> delegate;   //此处声明一个代理人,从而mother可以让代理人完成需要代理的事情

    }

    -(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete;  //传入代理人

    @property(nonatomic,copy)NSString *name;

    -(void)delagateThings;// 被代理的事情

    @end

    //实现文件

    #import "Morther.h"

    #import "Nurse.h"

    @implementation Morther

    -(id)initWithName:(NSString *)_name delagat:(id)_delagete

    {

        self=[super init];

        if (self) {

            if (name!=_name) {

                [name release];

                name=[_name copy];

                [delegate release];

                delegate=[_delagete retain];

            }

        }

        return self;

    }

    @synthesize name;

    -(void)dealloc

    {

        [name release];

        [delegate release];

        NSLog(@"host is dealloc");

    }

    -(void)delagateThings

    {

        int i;

        switch (i) {

            case 1:

                [delegate takeEat];

                break;

            case 2:

                [delegate takePlay];

                break;

            case 3:

                [delegate takeShower];

                break;

            case 4:

                [delegate takeSleep];

                break;

            default:

                break;

        }

        i++;

    }

    @end

    看看 在 main 文件中是怎么实现的:

    #import <Foundation/Foundation.h>

    #import "Morther.h"

    #import "Nurse.h"

    #import "Job.h"

    int main (int argc, const char * argv[])

    {

        @autoreleasepool {

            

            NSString *name=[[NSString alloc] initWithFormat:@"小花"];

            Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie

            Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//这样就将代理人传入mother 对象中,这样morther对象便可以通过nurse来完成她自己不能坐的事情了。

            [name release];

            [NSTimer scheduledTimerWithTimeInterval:2 target:morther selector:@selector(delagateThings) userInfo:nilrepeats:YES];  //调用机制,  2秒调用一次, 调用的对象是morther , 调用的方法是delagateThings;

            [[NSRunLoop currentRunLoop] run];  //让程序一直运行下去,保证上面的调用可以一直进行

            [morther release];

            [fengjie release];    

        }

        return 0;

    }

    代理中,需要记住的关键是在发出代理请求的类(A)中声明代理人(B)的实例变量,这样就可以保证A 能通过调用B中B代理的方法来完成B代理的事情,即自己代理给B 的事情。

  • 相关阅读:
    《海思VPSS — 将1920*1080图像通过VPSS缩放旋转成800*1280在LCD上显示》
    《Shell编程实例 —— 自动检测并挂载硬盘》
    《Shell脚本学习 —— 运算符、输入/输出重定向》
    《Shell脚本学习 —— 函数、文件包含》
    《Shell脚本学习 —— 流程控制if、for、while、无限循环、until、case、跳出循环》
    《Shell脚本学习 —— Shell传递参数、echo命令、test命令》
    牛客多校第三场 A—pacm team (4维背包加路径压缩)
    牛客第二场Dmoney
    牛客第二场A-run
    牛客第二场A-run
  • 原文地址:https://www.cnblogs.com/u0mo5/p/4979769.html
Copyright © 2011-2022 走看看