ios开发:代理设计模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ios开发:代理设计模式相关的知识,希望对你有一定的参考价值。

  代理是一种简单而功能强大的设计模式,这种模式用于一个对象“代表”另外一个对象去做和实现一些东西。 主对象维护一个代理(delegate)的引用并且在合适的时候向这个代理发送消息,这个消息通知“代理”对象即将处理或是已经处理完了某一个事件。这个代理可以通过更新自己或是其它对象的UI界面或是其它状态来响应主对象所发送过来的这个事件的消息。或是在某些情况下能返回一个值来影响其它即将发生的事件该如何来处理。代理的主要价值是它可以让你容易的定制各种对象的行为。

  为了方便大家理解,我在这里举了个简单的例子,有这样一个情景:一个家庭里有一个孩子,很小还不会吃饭,所以在饿了的时候需要妈妈来喂。在这里我们把孩子当作一个主对象,妈妈当作代理对象看一下代理模式的实现。

直接来看一下代码

TestDelegate.h

技术分享
@protocol TestDelegate

@required

-(void)feetBaby;

@optional
-(void)playWithBaby;

@end

 

技术分享

在这里定义了一个代理TestDelegate 注意到代理函数分为@required和@optional两种,前者是必须实现的函数,后者是选择性实现的函数

Baby.h

技术分享
#import <Foundation/Foundation.h>
#import "TestDelegate.h"
@interface Baby : NSObject
{
    
}
@property(nonatomic)NSString* name;
@property(nonatomic,retain)id<TestDelegate>delegate;
+(Baby*)initWithName:(NSString*)str;
-(void)hungry;

@end
技术分享

在baby.h中定义了一个delegate对象 并使他的类型为id  因为不知道哪个类的对象会接受这个代理并实现代理函数  所以定义为id类型

Baby.m

技术分享
#import "Baby.h"

@implementation Baby
@synthesize name;
@synthesize delegate;
+(Baby*)initWithName:(NSString *)str
{
    Baby* baby = [[Baby alloc]init];
    baby.name = str;
    return baby;
}
-(void)hungry
{
    NSLog(@"%@ is hungry",self.name);
    [delegate feetBaby];
}
@end
技术分享

 在baby.m中  写了hungry函数  ,因为孩子在饿了的时候  会叫着要吃饭  ,虽然自己不会吃 ,但是知道有人会来喂他,而且不知道这个人是谁,所以在hungry中调用[delegate feetBaby]; 意为让接受了TestDelegate并实现了feetBaby方法的对象来喂孩子

 

Mother.h

技术分享
#import <Foundation/Foundation.h>
#import "TestDelegate.h"
@interface Mother : NSObject<TestDelegate>
{
    
}
@property(nonatomic)NSString* name;

+(Mother*)initWithName:(NSString*)str;
@end
技术分享

很明显   在这里  mother这个类  接受了Testdelegate这个代理  注意使用某个代理的形式为 @interface Mother : NSObject<TestDelegate>

Mother.m

技术分享
#import "Mother.h"

@implementation Mother

@synthesize name;

+(Mother*)initWithName:(NSString *)str
{
    Mother* moth = [[Mother alloc]init];
    moth.name = str;
    return moth;
}
-(void)feetBaby
{
    NSLog(@"开始喂孩子了");
}
@end
技术分享

mother使用了TestDelegate这个代理  所以要实现feetbaby方法,前面说过@requird修饰的方法是必须实现的  要不会报错,@optional修饰的可以选择 实现不实现无所谓,下面看一下怎么main函数的写法

main.m

技术分享
#import <Foundation/Foundation.h>
#import "Baby.h"
#import "Mother.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Baby*baby = [Baby initWithName:@"bob"];
        Mother* mot = [Mother  initWithName:@"Lily"];
          baby.delegate = mot ;
        [baby hungry];
      
    }
    return 0;
}
技术分享

一定要注意这里 baby.delegate = mot ; 这句代码,实现了baby的代理给了mot。

 

以上是关于ios开发:代理设计模式的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段

IOS开发-UI学习-delegate(代理)的使用

iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段

iOS开发:使用代理模式监听开关状态改变事件

iOS代码片段CodeSnippets