没有合适的资源?快使用搜索试试~ 我知道了~
56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1
需积分: 0 0 下载量 71 浏览量
2022-08-03
20:57:33
上传
评论
收藏 2.4MB PDF 举报
温馨提示
试读
13页
56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1
资源详情
资源评论
资源推荐
56 | 观察者模式(上):详解各种应用场景下观察者模式的不同实现
方式
2020-03-11 王争
设计模式之美
进入课程
讲述:冯永吉
时长 11:41 大小 10.71M
我们常把 23 种经典的设计模式分为三类:创建型、结构型、行为型。前面我们已经学习了
创建型和结构型,从今天起,我们开始学习行为型设计模式。我们知道,创建型设计模式主
要解决“对象的创建”问题,结构型设计模式主要解决“类或对象的组合或组装”问题,那
行为型设计模式主要解决的就是“类或对象之间的交互”问题。
行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观
察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘
录模式、命令模式、解释器模式、中介模式。
下载APP
今天,我们学习第一个行为型设计模式,也是在实际的开发中用得比较多的一种模式:观察
者模式。根据应用场景的不同,观察者模式会对应不同的代码实现方式:有同步阻塞的实现
方式,也有异步非阻塞的实现方式;有进程内的实现方式,也有跨进程的实现方式。今天我
会重点讲解原理、实现、应用场景。下一节课,我会带你一块实现一个基于观察者模式的异
步非阻塞的 EventBus,加深你对这个模式的理解。
话不多说,让我们正式开始今天的学习吧!
原理及应用场景剖析
观察者模式(Observer Design Pattern)也被称为发布订阅模式(Publish-Subscribe
Design Pattern)。在 GoF 的《设计模式》一书中,它的定义是这样的:
Define a one-to-many dependency between objects so that when one object
changes state, all its dependents are notified and updated automatically.
翻译成中文就是:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依
赖的对象都会自动收到通知。
一般情况下,被依赖的对象叫作被观察者(Observable),依赖的对象叫作观察者
(Observer)。不过,在实际的项目开发中,这两种对象的称呼是比较灵活的,有各种不
同的叫法,比如:Subject-Observer、Publisher-Subscriber、Producer-Consumer、
EventEmitter-EventListener、Dispatcher-Listener。不管怎么称呼,只要应用场景符合
刚刚给出的定义,都可以看作观察者模式。
实际上,观察者模式是一个比较抽象的模式,根据不同的应用场景和需求,有完全不同的实
现方式,待会我们会详细地讲到。现在,我们先来看其中最经典的一种实现方式。这也是在
讲到这种模式的时候,很多书籍或资料给出的最常见的实现方式。具体的代码如下所示:
复制代码
1
2
3
4
5
6
7
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(Message message);
}
public interface Observer {
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
void update(Message message);
}
public class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(Message message) {
for (Observer observer : observers) {
observer.update(message);
}
}
}
public class ConcreteObserverOne implements Observer {
@Override
public void update(Message message) {
//TODO: 获取消息通知,执行自己的逻辑...
System.out.println("ConcreteObserverOne is notified.");
}
}
public class ConcreteObserverTwo implements Observer {
@Override
public void update(Message message) {
//TODO: 获取消息通知,执行自己的逻辑...
System.out.println("ConcreteObserverTwo is notified.");
}
}
public class Demo {
public static void main(String[] args) {
ConcreteSubject subject = new ConcreteSubject();
subject.registerObserver(new ConcreteObserverOne());
subject.registerObserver(new ConcreteObserverTwo());
subject.notifyObservers(new Message());
}
}
剩余12页未读,继续阅读
十二.12
- 粉丝: 35
- 资源: 276
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0