Skip to content

Latest commit

 

History

History
107 lines (77 loc) · 2.73 KB

Observer.md

File metadata and controls

107 lines (77 loc) · 2.73 KB

#观察者模式

##概念

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。 观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

##实现

这三步必须实现

  • 添加观察者
  • 发送通知
  • 移除观察者

讲解之前我们首先了解4个方法,我们也要使用到系统的一个单例NSNotificationCenter

// 获取系统通知中心
+ (NSNotificationCenter *)defaultCenter;
// 添加观察者
// 参数1:观察者
// 参数2:观察者的方法
// 参数3:观察的通知姓名
// 参数3:传递的参数
- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;
// 发送通知
// 参数1:通知的姓名
// 参数2:通知的参数
- (void)postNotificationName:(NSString *)aName object:(id)anObject;
// 移除观察者
- (void)removeObserver:(id)observer;

接下来我们模拟一个通知,首先我们创建两个类Student以及Teacher,当铃声响起的时候,老师就调用一个行为,而学生也调用一个行为,相同于一直在监听某个事物

@interface Student : NSObject

@end
@interface Teacher : NSObject

@end

接着我们在.M文件分别写上代码:

#import "Student.h"

@implementation Student

- (void)dealloc
{
	// 第三步,移除观察者
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        // 第一步,添加通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ring) name:@"RING" object:nil];
    }
    return self;
}

- (void)ring
{
    NSLog(@"放学了!");
}

@end

老师实现文件也是一样,唯一不同的是

- (void)ring
{
    NSLog(@"下班了!");
}

然后我们在mian函数中创建相应的对象,并且发送通知

// 创建对象
Teacher *teacher1 = [[Teacher alloc] init];
Student *stu1 = [[Student alloc] init];
   
// 发送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"RING" object:nil];

打印结果

2015-04-15 22:57:44.310 OC_Lesson5[2257:219593] 下班了!
2015-04-15 22:57:44.311 OC_Lesson5[2257:219593] 放学了!