[设计模式]_[Object-c]_[观察者模式在项目中实际使用例子2]

场景

  1. 在使用C/C++开发界面时,在两个界面通讯我们之前通过 观察者模式在项目中实际使用例子 来进行数据传输,而不是通过互相引用的方式进行数据传输,互相引用的最大缺点就是耦合严重。

  2. 而在使用Object-c开发Cocoa界面时,也会出现这种情况,就是界面间如何通讯?Object-c只支持单继承,不支持多重继承,我们创建界面只能继承NSView,而不能再继承另外一个类,如何做?

  3. Object-c不支持多重继承,使用协议可以做到吗?协议只能声明接口函数,而不能声明属性,实现协议的类都必须重新实现一遍协议声明的函数,非常麻烦,不能重用。

说明

  1. 要实现目标对象,方法1是写一个子类MyView,并且这个子类继承NSView,并且在这个子类里添加Subject类的接口函数。这种方法的缺点就是如果窗口对象是NSButton类型,那么还要实现一个MyButton来作为Subject对象,所以这种方法不合适。

  2. 第二种方式就是使用组合模式,自定义一个DhSubjectDelegate代理类,用它来进行绑定Observer观察者,并通知观察者。比如XXView需要作为目标Subject, 当它发生某个事件时,可以通知注册的观察者。我们只需要在XXView里声明一个DhSubjectDelegate对象,并使用这个对象进行注册观察者和通知观察者即可。

  3. 至于观察者,只需要声明一个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];

参考

观察者模式在项目中实际使用例子

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白行峰 (花名)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值