OC学习笔记12--protocol的使用场景之代理模式

	
#import <Foundation/Foundation.h>

// 定义 作为Invoker代理 需要遵守的协议
@protocol InvokerDelegate <NSObject>
- (void)invoke;
@end


// Invoker
@interface Invoker :NSObject <InvokerDelegate>
{
	// 限定为只要遵守了该协议的任何类都能作为代理
	id<InvokerDelegate> _delegate;
}
- (void)setDelegate:(id<InvokerDelegate>) delegate;
- (id)initWithDelegate:(id<InvokerDelegate>)delegate;
+ (id)invokerWithDelegate:(id<InvokerDelegate>)delegate;
@end

@implementation Invoker

+ (id)invokerWithDelegate:(id<InvokerDelegate>)delegate
{
	return [[[self alloc] initWithDelegate:delegate] autorelease];
}

- (void)dealloc
{
	NSLog(@"%@ deallocated",[self className]);
	// InvokerDelegate 遵守基协议后,编译器便知道
	// id<InvokerDelegate>类型变量拥有基协议中的方法
	[_delegate release];
	[super dealloc];
}
- (void)setDelegate:(id<InvokerDelegate>) delegate
{
	if(delegate!=_delegate)
	{
		[_delegate release];
		_delegate=[delegate retain];
	}
}
- (id)initWithDelegate:(id<InvokerDelegate>)delegate
{
	if(self=[super init])
	{
		[self setDelegate:delegate];
	}
	return self;
}

-(void)invoke
{
	// 方法实现中直接让代理类去实现
	[_delegate invoke];
}
@end


// DelegateA
@interface DelegateA :NSObject <InvokerDelegate>
+ (id)delegateA;
@end

@implementation DelegateA
+ (id)delegateA
{
	return [[[self alloc] init] autorelease];
}

- (void)dealloc
{
	NSLog(@"%@ deallocated",[self className]);
	[super dealloc];
}
- (void)invoke
{
	NSLog(@"%@ be invoked",[self className]);
}
@end


// DelegateB
@interface DelegateB :NSObject <InvokerDelegate>
+ (id)delegateB;
@end

@implementation DelegateB
+ (id)delegateB
{
	return [[[self alloc] init] autorelease];
}

- (void)dealloc
{
	NSLog(@"%@ deallocated",[self className]);
	[super dealloc];
}

- (void)invoke
{
	NSLog(@"%@ be invoked",[self className]);
}
@end


int main()
{
	NSAutoreleasePool *pool =[[NSAutoreleasePool alloc] init];
	
	Invoker * invoker=[Invoker invokerWithDelegate:[DelegateA delegateA]];
	[invoker invoke];
	
	// 设置不同代理,invoke方法做的事也不一样
	// 只要对象遵守了指定协议,就能正常作为其代理
	[invoker setDelegate:[DelegateB delegateB]];
	[invoker invoke];
	
	[pool drain];
	return 0;
}


protocol在代理模式中:
1>利用id<protocol>来限制代理类须遵守某个协议
1>protocol须遵守基协议,让编译器知道该id拥有基协议中的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值