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類型+協議+多態

相關文章
相關標籤/搜索