Smalltalk 语言 设计模式之观察者模式实战

Smalltalk阿木 发布于 2025-05-29 8 次阅读


观察者模式【1】实战:Smalltalk【3】 语言中的设计模式【4】应用

设计模式是软件工程中解决常见问题的通用解决方案。观察者模式是其中一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。本文将使用Smalltalk语言,通过一个简单的示例来展示观察者模式在实战中的应用。

Smalltalk 简介

Smalltalk是一种面向对象的编程语言,以其简洁、优雅和强大的对象模型而闻名。它是一种动态类型语言【5】,具有动态绑定【6】和动态类型检查的特点。Smalltalk的语法简洁,易于理解,非常适合用于演示设计模式。

观察者模式概述

观察者模式包含两个主要角色:

1. Subject(主题【7】):被观察的对象,它维护一个观察者列表,并在状态变化时通知这些观察者。
2. Observer(观察者):观察主题的对象,它订阅主题的状态变化,并在状态变化时执行相应的操作。

实战示例:天气报告系统

在这个示例中,我们将创建一个天气报告系统,其中包含一个主题(WeatherStation【8】)和多个观察者(WeatherDisplay【9】)。当天气变化时,WeatherStation会通知所有注册的WeatherDisplay。

Step 1: 定义主题(WeatherStation)

smalltalk
| weatherStation |
weatherStation := WeatherStation new.

WeatherStation := class {
observers := Set new.
temperature := 0.
humidity := 0.
wind := 0.

initialize do: [ observers add: self ].
addObserver: anObserver.
setTemperature: aTemperature.
setHumidity: aHumidity.
setWind: aWind.

addObserver: anObserver do: aBlock.
observers add: anObserver.
anObserver update: self.

notifyObservers.
observers do: [ :anObserver | anObserver update: self ].

setTemperature: aTemperature do: [ temperature := aTemperature ].
setHumidity: aHumidity do: [ humidity := aHumidity ].
setWind: aWind do: [ wind := aWind ].

temperature get.
humidity get.
wind get.
}

Step 2: 定义观察者【2】(WeatherDisplay)

smalltalk
WeatherDisplay := class {
weatherStation := nil.

initialize: aWeatherStation do: [ weatherStation := aWeatherStation ].
update: aWeatherStation do: [ | temperature | temperature := aWeatherStation temperature.
"Display the updated weather information"
self displayTemperature: temperature ].

displayTemperature: aTemperature.
"Implementation of displaying the temperature"
}

Step 3: 创建观察者并注册到主题

smalltalk
display1 := WeatherDisplay new: weatherStation.
display2 := WeatherDisplay new: weatherStation.

weatherStation addObserver: display1.
weatherStation addObserver: display2.

Step 4: 更新天气信息并通知观察者

smalltalk
weatherStation setTemperature: 25.
weatherStation setHumidity: 70.
weatherStation setWind: 5.

Step 5: 查看输出结果

运行上述代码后,你将看到两个WeatherDisplay对象都显示了更新后的天气信息。

总结

本文通过Smalltalk语言展示了观察者模式在实战中的应用。通过定义主题和观察者,我们能够轻松地实现对象之间的解耦【10】,使得主题对象的状态变化能够自动通知所有观察者。这种模式在需要处理复杂事件和对象之间依赖关系时非常有用。

后续思考

1. 如何在Smalltalk中实现观察者模式的动态注册和注销?
2. 如何在观察者模式中处理观察者之间的依赖关系?
3. 观察者模式与其他设计模式(如发布-订阅模式【11】)有何异同?

通过深入研究和实践这些设计模式,我们可以更好地理解和应用它们,从而提高我们的软件开发技能。