前言:今天还是有些意外收获的,本来只是在学习观察者模式,想着被观察者的变化是如何通知给观察者的。在自然世界,两个个体之间传递消息,是无需强绑定的,中间总有媒介,比如:面对面交流通过空气传播声音,远程交流通过电话或网络传播信息。而Java世界不同,需要强绑定。那是不是Java世界所有的消息传递都一定要强绑定呢?未必!
首先,我们先来说一说【观察者模式】。设计模式按照解决问题分为三类:创建型(Creational)设计模式、结构型(Structural)设计模式和行为(Behavioral)设计模式,观察者模式(Observer Pattern)属于行为设计模式。
观察者模式需要两个基本抽象对象:被观察者Subject和观察者Observer,被观察者一旦有变化,观察者立马能收到消息(由被观察者发送消息通知)。
之所以为抽象对象,因为我们并不知道被观察者具体为何物,有可能是一个交通灯,有可能是平安银行的股价,也有可能是特快T1的到站情况。观察者亦然,有可能是一个AI摄像头,有可能是具体的某个人,也有可能是接站员。因此在【观察者模式】的类图如下,包括:被观察者和观察者两个接口,被观察者和观察者两个具体实现类,被观察者实现类对象持有多个观察者实现类的对象(这里非常重要,体现了Java世界中的消息传递方式,必须持有被被通知人的对象引用)。
观察者模式的具体实现代码如下:
# 被观察者接口
public interface Subject {
void add(Observer observer);
void remove(Observer observer);
void notify(String message);
}
# 观察者接口
public interface Observer {
void update(String message);
}
# 被观察者【交通灯】对象
public class LightSubject implements Subject{
// 此处持有多个观察者对象的引用
private List<