场景
-
在使用
C/C++开发界面时,在两个界面通讯我们之前通过 观察者模式在项目中实际使用例子 来进行数据传输,而不是通过互相引用的方式进行数据传输,互相引用的最大缺点就是耦合严重。 -
而在使用
Object-c开发Cocoa界面时,也会出现这种情况,就是界面间如何通讯?Object-c只支持单继承,不支持多重继承,我们创建界面只能继承NSView,而不能再继承另外一个类,如何做? -
Object-c不支持多重继承,使用协议可以做到吗?协议只能声明接口函数,而不能声明属性,实现协议的类都必须重新实现一遍协议声明的函数,非常麻烦,不能重用。
说明
-
要实现目标对象,方法1是写一个子类
MyView,并且这个子类继承NSView,并且在这个子类里添加Subject类的接口函数。这种方法的缺点就是如果窗口对象是NSButton类型,那么还要实现一个MyButton来作为Subject对象,所以这种方法不合适。 -
第二种方式就是使用组合模式,自定义一个
DhSubjectDelegate代理类,用它来进行绑定Observer观察者,并通知观察者。比如XXView需要作为目标Subject, 当它发生某个事件时,可以通知注册的观察者。我们只需要在XXView里声明一个DhSubjectDelegate对象,并使用这个对象进行注册观察者和通知观察者即可。 -
至于观察者,只需要声明一个
DhObserver协议即可。
代码
#import <Foundation/Foundation.h>
@protocol DhObserver <NSObject>
-(void)receiveMessage:(id)userdata withType:(int)type withSender:(id)sender;
@end
#import <Foundation/Foundation.h>
#import "DhObserver.h"
@interface DhSubjectDelegate : NSObject
@property (readonly,assign) id owner;
-(void) attachObserver:(id<DhObserver>) observer;
-(void) detachObserver:(id<DhObserver>) observer;
-(void) notifyObserver:(id) userdata withType:(int) type;
@end
#import "DhSubjectDelegate.h"
@interface DhSubjectDelegate()
{
NSMutableArray* observers_;
}
@end
@implementation DhSubjectDelegate
@synthesize owner;
-(id)init
{
if (![super init])
return nil;
observers_ = [NSMutableArray new];
return self;
}
-(void)dealloc
{
[observers_ release];
[super dealloc];
}
-(void) attachObserver:(id<DhObserver>) observer
{
[observers_ addObject:observer];
}
-(void) detachObserver:(id<DhObserver>) observer
{
[observers_ removeObject:observer];
}
-(void) notifyObserver:(id) userdata withType:(int) type
{
for(id<DhObserver> observer in observers_){
[observer receiveMessage:userdata withType:type withSender:self];
}
}
@end
如何使用?
// detailView 声明一个subjectDelegate属性并初始化。
// self所代表的类实现DhServer协议。
[detailView.subjectDelegate attachObserver:self];
// detailView里通知注册的目标。
[subjectDelegate notifyObserver:pp withType:kMySmsCommandIsSendAChat];

869

被折叠的 条评论
为什么被折叠?



