观察者模式【1】在Smalltalk【2】语言中的实战:实时监控系统【3】设计
观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。Smalltalk语言作为一种面向对象的语言,非常适合实现观察者模式。本文将围绕Smalltalk语言,通过一个实时监控系统设计案例,展示如何使用观察者模式来实现系统的动态更新和响应。
观察者模式概述
观察者模式包含两个主要角色:
1. Subject【4】(主题):被观察的对象,它维护一个观察者列表,并提供注册、注销和通知观察者的接口。
2. Observer【5】(观察者):观察主题的对象,它需要实现一个更新接口,当主题状态发生变化时,会自动调用该接口。
实时监控系统设计
系统需求
设计一个实时监控系统,用于监控网络流量【6】、服务器负载【7】和数据库状态【8】。当这些指标超过预设阈值【9】时,系统应立即通知管理员。
系统架构
1. Subject(主题):定义一个`MonitorSubject【10】`类,用于监控各种指标。
2. Observer(观察者):定义一个`AlertObserver【11】`类,用于接收通知并执行相应的操作。
3. ConcreteSubject【12】(具体主题):定义具体的监控对象,如`NetworkMonitor`、`ServerMonitor`和`DatabaseMonitor`。
4. ConcreteObserver【13】(具体观察者):定义具体的观察者,如`EmailAlertObserver`和`SMSAlertObserver`。
Smalltalk代码实现
```smalltalk
| MonitorSubject AlertObserver NetworkMonitor ServerMonitor DatabaseMonitor EmailAlertObserver SMSAlertObserver |
"Subject"
MonitorSubject := class new
instanceVariableNames【14】: 'observers【15】'.
classVariableNames【16】: 'instanceCount【17】'.
class newInstVarNamesFrom【18】: 'observers'.
class newClassVarFrom【19】: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom: 'instanceCount'.
class newClassVarFrom
Comments NOTHING