标签:UI style ndt bae smp sep vlc pmi nis
何实现代理模式的。
这里举一个简单的例子:
小孩类,护士类,保姆类,其中小孩类有两个方法:wash和play
这里代理对象就是:护士类、保姆类,小孩类是被代理对象。
看一下代码:
首先看一下小孩类:
Children.h
-
- #import <Foundation/Foundation.h>
-
- @class Children;
-
- @protocol ChildrenDelegate <NSObject>
-
- @required
- - (void)wash:(Children *)children;
- - (void)play:(Children *)children;
-
- @end
-
- @interface Children : NSObject{
-
-
-
-
-
- id<ChildrenDelegate> _delegate;
- NSInteger timeValue;
- }
-
- -(void)setDelegate:(id)delegate;
-
- @end
这里,我们定义了一个协议:ChildrenDelegate,他有两个必要的方法:wash和play
我们还定义了一个很重要的属性
_delegate
这个属性定义有点不一样,这个就是实现代理对象的精髓所在了,id是不确定类型,所以这个_delegate变量可以被赋值为的类型是:
只要实现了ChildrenDelegate协议的类就可以了。这里就记住了,以后这种定义方法后面会用到很多。相当于Java中的接口类型,只能赋值其实现类的类型。只是这里的定义格式为:id<协议名>
然后就是一个设置协议的方法了,注意参数类型也必须是id的
其实这里面也牵涉到了之前说到的多态特性,所以说代理模式也是建立在多态的特性上的。
Children.m
-
- #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
-
- #import <Foundation/Foundation.h>
-
- #import "Children.h"
-
- @interface Nure : NSObject<ChildrenDelegate>
-
- - (void)wash:(Children *)children;
- - (void)play:(Children *)children;
-
- @end
护士类很简单,实现ChildrenDelegate协议
Nure.m
-
- #import "Nure.h"
-
- #import "Children.h"
-
- @implementation Nure
-
- - (void)wash:(Children *)children{
- NSLog(@"小孩脏了,保姆帮小孩洗澡");
- }
-
- - (void)play:(Children *)children{
- NSLog(@"小孩哭了,保姆和小孩玩耍");
- }
-
- @end
在这里就去实现wash和play方法了
在来看一下保姆类:
Nanny.h
-
- #import <Foundation/Foundation.h>
-
- #import "Children.h"
-
- @interface Nanny : NSObject<ChildrenDelegate>
-
- - (void)wash:(Children *)children;
- - (void)play:(Children *)children;
-
- @end
Nanny.m
-
- #import "Nanny.h"
-
- #import "Children.h"
-
- @implementation Nanny
-
- - (void)wash:(Children *)children{
- NSLog(@"小孩脏了,护士帮小孩洗澡");
- }
-
- - (void)play:(Children *)children{
- NSLog(@"小孩哭了,护士和小孩玩耍");
- }
-
- @end
保姆类和护士类的代码逻辑是一样的,因为他们两个都是实现了一个协议
测试类
main.m
-
- #import <Foundation/Foundation.h>
-
- #import "Children.h"
- #import "Nure.h"
- #import "Nanny.h"
-
-
- int main(int argc, const charchar * argv[]) {
- @autoreleasepool {
- Children *child = [[Children alloc] init];
-
- Nure *nure = [[Nure alloc] init];
- Nanny *nanny= [[Nanny alloc] init];
-
- [child setDelegate:nanny];
-
- [[NSRunLoop currentRunLoop] run];
- }
- return 0;
- }
看到了,测试类很简单。我们也发现了,代理模式的好处也是显现出来了,比如现在又来了一个人来照顾孩子:妈妈类,那么我们只要让妈妈类实现那个协议即可。这种耦合度也不会很高。所以代理模式还是超级有用的,而且我们后面在开发IOS的时候,会发现他里面用到的代理模式很多的。
运行结果:
OC学习篇之---代理模式
标签:UI style ndt bae smp sep vlc pmi nis
原文地址:http://www.cnblogs.com/anakin/p/7815460.html