OC学习篇之---代理模式
在前一篇文章我們介紹了OC中的協(xié)議的概念:http://blog.csdn.net/jiangwei0910410003/article/details/41776015,這篇文章我們就來(lái)介紹一下OC中的代理模式,關(guān)于代理模式,如果還有同學(xué)不太清楚的話,就自己去補(bǔ)充知識(shí)了,這里就不做介紹了,這里只介紹OC中是如何實(shí)現(xiàn)代理模式的。
這里舉一個(gè)簡(jiǎn)單的例子:
小孩類(lèi),護(hù)士類(lèi),保姆類(lèi),其中小孩類(lèi)有兩個(gè)方法:wash和play
這里代理對(duì)象就是:護(hù)士類(lèi)、保姆類(lèi),小孩類(lèi)是被代理對(duì)象。
看一下代碼:
首先看一下小孩類(lèi):
Children.h
// // Children.h // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. //#import <Foundation/Foundation.h>@class Children;//如果沒(méi)有這行代碼的話,協(xié)議ChildrenDelegate中得Children類(lèi)型就會(huì)查找不到,報(bào)錯(cuò)@protocol ChildrenDelegate <NSObject>@required - (void)wash:(Children *)children; - (void)play:(Children *)children;@end@interface Children : NSObject{//Nure *_nure;//保姆//這里可以使用多態(tài)技術(shù)實(shí)現(xiàn),因?yàn)楸D?#xff0c;護(hù)士有共同的父類(lèi)NSObject,但是這里不使用這種方式,而是使用id類(lèi)型//但是我們還需要為這個(gè)類(lèi)型添加一些方法,這里就用到了協(xié)議//這個(gè)代理對(duì)象必須遵從ChildrenDelegate協(xié)議id<ChildrenDelegate> _delegate;//這個(gè)變量就是小孩的代理對(duì)象NSInteger timeValue; }-(void)setDelegate:(id)delegate;@end 這里,我們定義了一個(gè)協(xié)議:ChildrenDelegate,他有兩個(gè)必要的方法:wash和play
我們還定義了一個(gè)很重要的屬性
_delegate
這個(gè)屬性定義有點(diǎn)不一樣,這個(gè)就是實(shí)現(xiàn)代理對(duì)象的精髓所在了,id是不確定類(lèi)型,所以這個(gè)_delegate變量可以被賦值為的類(lèi)型是:
只要實(shí)現(xiàn)了ChildrenDelegate協(xié)議的類(lèi)就可以了。這里就記住了,以后這種定義方法后面會(huì)用到很多。相當(dāng)于Java中的接口類(lèi)型,只能賦值其實(shí)現(xiàn)類(lèi)的類(lèi)型。只是這里的定義格式為:id<協(xié)議名>
然后就是一個(gè)設(shè)置協(xié)議的方法了,注意參數(shù)類(lèi)型也必須是id的
其實(shí)這里面也牽涉到了之前說(shuō)到的多態(tài)特性,所以說(shuō)代理模式也是建立在多態(tài)的特性上的。
Children.m
// // Children.m // 12_DesignStyle // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. //#import "Children.h"//這里用到了保姆的一些動(dòng)作 //假如現(xiàn)在想請(qǐng)一個(gè)護(hù)士,那么我們又要去從新去請(qǐng)一個(gè)護(hù)士,那么這里面代碼需要改,把保姆的地方換成護(hù)士的地方 //產(chǎn)生的原因就是因?yàn)轳詈隙忍吡?#xff0c;保姆和孩子耦合在一起,如果需要換的話,就需要改動(dòng)代碼 // @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 我們自定義了一個(gè)初始化方法,在初始化方法中我們做了一個(gè)定時(shí)器的工作。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];這個(gè)就是OC中啟動(dòng)一個(gè)簡(jiǎn)單的計(jì)時(shí)器:每隔1s中就去執(zhí)行一次self中的timerAction方法。
OC中的定時(shí)器和java不一樣,他的執(zhí)行邏輯可以單獨(dú)的在一個(gè)指定的方法中去做(C中的函數(shù)指針差不多,只要傳遞一個(gè)函數(shù)指針過(guò)來(lái),就可以執(zhí)行指定的函數(shù),所以@selector做的工作就是這個(gè)),但是Java中必須實(shí)現(xiàn)Runable接口,在run方法中執(zhí)行指定的邏輯代碼。
在timerAction方法中,我們是判斷當(dāng)時(shí)間到5s了,就執(zhí)行代理對(duì)象的wash方法,10s的時(shí)候執(zhí)行play方法。
在來(lái)看一下護(hù)士類(lèi):
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 護(hù)士類(lèi)很簡(jiǎn)單,實(shí)現(xiàn)ChildrenDelegate協(xié)議
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 在這里就去實(shí)現(xiàn)wash和play方法了
在來(lái)看一下保姆類(lèi):
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(@"小孩臟了,護(hù)士幫小孩洗澡"); }- (void)play:(Children *)children{NSLog(@"小孩哭了,護(hù)士和小孩玩耍"); }@end 保姆類(lèi)和護(hù)士類(lèi)的代碼邏輯是一樣的,因?yàn)樗麄儍蓚€(gè)都是實(shí)現(xiàn)了一個(gè)協(xié)議
測(cè)試類(lèi)
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類(lèi)型+協(xié)議 //做到低耦合操作 //同時(shí)也可以做到兩個(gè)類(lèi)之間的通信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; } 看到了,測(cè)試類(lèi)很簡(jiǎn)單。我們也發(fā)現(xiàn)了,代理模式的好處也是顯現(xiàn)出來(lái)了,比如現(xiàn)在又來(lái)了一個(gè)人來(lái)照顧孩子:媽媽類(lèi),那么我們只要讓媽媽類(lèi)實(shí)現(xiàn)那個(gè)協(xié)議即可。這種耦合度也不會(huì)很高。所以代理模式還是超級(jí)有用的,而且我們后面在開(kāi)發(fā)IOS的時(shí)候,會(huì)發(fā)現(xiàn)他里面用到的代理模式很多的。
運(yùn)行結(jié)果:
總結(jié)
這一篇就介紹了OC中如何實(shí)現(xiàn)代理模式,其實(shí)OC中的代理模式核心技術(shù)是:id類(lèi)型+協(xié)議+多態(tài)
轉(zhuǎn)載于:https://www.cnblogs.com/roccheung/p/5797303.html
總結(jié)
以上是生活随笔為你收集整理的OC学习篇之---代理模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 中的几种 通用方法“
- 下一篇: 转载:使用Auto Layout中的VF