为了严格遵循MVC,MVVM等架构模式,经常需要对象去耦。
10、中介者模式:用一个对象来封装一系列对象的交互方式。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
11、观察者模式(发布-订阅模式):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
(1) 通知:
当然最后如果我们需要对监听进行销毁
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
(2) KVO:
KVO是Cocoa提供的一种称为键值观察的机制,对象可以通过它得到其他对象特定属性的变更通知。而这个机制是基于NSKeyValueObserving非正式些,Cocoa通过这个协议为所有遵循协议的对象提供了一种自动化的属性监听的功能。
通知和KVO区别:
虽然通知和KVO都可以对观察者进行实现,但是他们之间还是略有不同的,由上面的例子我们可以看出通知是由一个中心对象为所有观察者提供变更通知,主要是广义上关注程序事件,而KVO则是被观察的对象直接想观察者发送通知,主要是绑定于特定对象属性的值。
(
首先我们有Hero这个模型
@property (nonatomic,copy) NSString * name;
@property (nonatomic,copy) NSString * title;
@property (nonatomic,assign) NSUInteger age;
在控制其中我们将其初始化并赋值
self.hero = [[Hero alloc] init];
self.hero.name = @"赵云";
self.hero.title = @"将军";
self.hero.age = 87;
现在我们的这个对象基本有值了,那么我们将这个对象的name监听下他的改变
[self.hero addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
触发通知并将值改变
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
self.hero.name = @"张飞";
}
在制定的回调函数中,处理收到的更改通知
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if([keyPath isEqualToString:@"name"])
{
NSLog(@"赋值后--%@",self.hero.name);
NSLog(@"新的值--%@",change[@"new"]);
NSLog(@"以前的值--%@",change[@"old"]);
}
}
)
最后注销观察者
- (void)dealloc{
[self.hero removeObserver:self forKeyPath:@"name"];
}