OC学习篇之---代理模式 分类: IOS 2014-12-06 20:35 4392人阅读 评论(1) 收藏

在前一篇文章咱们介绍了OC中的协议的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,这篇文章咱们就来介绍一下OC中的代理模式,关于代理模式,若是还有同窗不太清楚的话,就本身去补充知识了,这里就不作介绍了,这里只介绍OC中是如何实现代理模式的。java

这里举一个简单的例子:函数

小孩类,护士类,保姆类,其中小孩类有两个方法:wash和playoop

这里代理对象就是:护士类、保姆类,小孩类是被代理对象。测试

看一下代码:ui

首先看一下小孩类:spa

Children.h.net

//
//  Children.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

@class Children;//若是没有这行代码的话,协议ChildrenDelegate中得Children类型就会查找不到,报错

@protocol ChildrenDelegate <NSObject>

@required
- (void)wash:(Children *)children;
- (void)play:(Children *)children;

@end

@interface Children : NSObject{
    
    //Nure *_nure;//保姆
    //这里可使用多态技术实现,由于保姆,护士有共同的父类NSObject,可是这里不使用这种方式,而是使用id类型
    //可是咱们还须要为这个类型添加一些方法,这里就用到了协议
    //这个代理对象必须听从ChildrenDelegate协议
    id<ChildrenDelegate> _delegate;//这个变量就是小孩的代理对象
    NSInteger timeValue;
}

-(void)setDelegate:(id)delegate;

@end
这里,咱们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play

咱们还定义了一个很重要的属性代理

_delegate指针

这个属性定义有点不同,这个就是实现代理对象的精髓所在了,id是不肯定类型,因此这个_delegate变量能够被赋值为的类型是:code

只要实现了ChildrenDelegate协议的类就能够了。这里就记住了,之后这种定义方法后面会用到不少。至关于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>

而后就是一个设置协议的方法了,注意参数类型也必须是id的

其实这里面也牵涉到了以前说到的多态特性,因此说代理模式也是创建在多态的特性上的。


Children.m

//
//  Children.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Children.h"

//这里用到了保姆的一些动做
//假如如今想请一个护士,那么咱们又要去重新去请一个护士,那么这里面代码须要改,把保姆的地方换成护士的地方
//产生的缘由就是由于耦合度过高了,保姆和孩子耦合在一块儿,若是须要换的话,就须要改动代码
//
@implementation Children

- (id)init{
    self = [super init];
    if(self != nil){
        [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
    }
    return self;
}

-(void)setDelegate:(id)delegate{
    _delegate = delegate;
}

- (void)timerAction:(NSTimer *)timer{
    timeValue++;
    if(timeValue == 5){
        [_delegate wash:self];
    }
    if(timeValue == 10){
        [_delegate play:self];
    }
}

@end
咱们自定义了一个初始化方法,在初始化方法中咱们作了一个定时器的工做。

[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];
这个就是OC中启动一个简单的计时器:每隔1s中就去执行一次self中的timerAction方法。

OC中的定时器和java不同,他的执行逻辑能够单独的在一个指定的方法中去作(C中的函数指针差很少,只要传递一个函数指针过来,就能够执行指定的函数,因此@selector作的工做就是这个),可是Java中必须实现Runable接口,在run方法中执行指定的逻辑代码。

在timerAction方法中,咱们是判断当时间到5s了,就执行代理对象的wash方法,10s的时候执行play方法。


在来看一下护士类:

Nure.h

//
//  Nure.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Children.h"

@interface Nure : NSObject<ChildrenDelegate>

- (void)wash:(Children *)children;
- (void)play:(Children *)children;

@end
护士类很简单,实现ChildrenDelegate协议


Nure.m

//
//  Nure.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Nure.h"

#import "Children.h"

@implementation Nure

- (void)wash:(Children *)children{
    NSLog(@"小孩脏了,保姆帮小孩洗澡");
}

- (void)play:(Children *)children{
    NSLog(@"小孩哭了,保姆和小孩玩耍");
}

@end
在这里就去实现wash和play方法了


在来看一下保姆类:

Nanny.h

//
//  Nanny.h
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Children.h"

@interface Nanny : NSObject<ChildrenDelegate>

- (void)wash:(Children *)children;
- (void)play:(Children *)children;

@end

Nanny.m

//
//  Nanny.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import "Nanny.h"

#import "Children.h"

@implementation Nanny

- (void)wash:(Children *)children{
    NSLog(@"小孩脏了,护士帮小孩洗澡");
}

- (void)play:(Children *)children{
    NSLog(@"小孩哭了,护士和小孩玩耍");
}

@end
保姆类和护士类的代码逻辑是同样的,由于他们两个都是实现了一个协议


测试类

main.m

//
//  main.m
//  12_DesignStyle
//
//  Created by jiangwei on 14-10-11.
//  Copyright (c) 2014年 jiangwei. All rights reserved.
//

#import <Foundation/Foundation.h>

#import "Children.h"
#import "Nure.h"
#import "Nanny.h"

//核心:id类型+协议
//作到低耦合操做
//同时也能够作到两个类之间的通讯

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Children *child = [[Children alloc] init];
        
        Nure *nure = [[Nure alloc] init];
        Nanny *nanny= [[Nanny alloc] init];
        
        [child setDelegate:nanny];
//      [child setNure:nure];
        
        [[NSRunLoop currentRunLoop] run];
    }
    return 0;
}
看到了,测试类很简单。咱们也发现了,代理模式的好处也是显现出来了,好比如今又来了一我的来照顾孩子:妈妈类,那么咱们只要让妈妈类实现那个协议便可。这种耦合度也不会很高。因此代理模式仍是超级有用的,并且咱们后面在开发IOS的时候,会发现他里面用到的代理模式不少的。


运行结果:




总结

这一篇就介绍了OC中如何实现代理模式,其实OC中的代理模式核心技术是:id类型+协议+多态

相关文章
相关标签/搜索