持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天
介绍
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
使用场景
-
当一个抽象模型有两个方面,其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
-
当对一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要被改变。
-
当一个对象必须通知其他对象,而它又不能假定其他对象是谁。换言之,不希望这些对象是紧密耦合的
应用实践
职责明确
-
抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
-
****具体主题(Concrete Subject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
-
****抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己
-
********具体观察者(Concrete Observer):**实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。 [3]
实现
interface Observer {
public void update();
}
// 提取 Subject 的公共部分
abstract class Subject {
private list = [];
public void attach(observer) {
list.add(observer);
}
public detach(Observer observer) {
list.remove(observer);
}
public notifyObserver() {
for (let observer in list) {
observer.update();
}
}
}
// 具体主题
class Wenzhang extends Subject {
private post;
public void writePost(String p) {
post = p;
}
public getPost() {
return post;
}
}
class Person implements Observer {
private subject;
constructor() {
subject = sub;
}
public update() {
}
}
const wenzhang = new Wenzhang(); // Subject
const user1 = new Person()
wenzhang.attach(user1)
wenzhang.writePost("新文章-观察者模式,balabala"); // 更新文章
wenzhang.notifyObserver(); // 通知观察者
汇总
观察者模式优点:
1.支持简单的广播通信,自动通知所有已经订阅过的对象
2.页面载入后目标对象很容易与观察者存在一种动态关联,增加了灵活性。
3.目标对象与观察者之间的抽象耦合关系能够单独扩展以及重用
4.观察者模式可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。
观察者模式缺点:
1.创建订阅者需要消耗一定内存。
2.过度使用,反而使代码不好理解及代码不好维护
3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
4.如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。