观察者模式是软件开发中常用的一种设计模式,它通过定义一对多的依赖关系,使得一个对象(主题)的状态变化可以通知多个其他对象(观察者)。
这种模式的优点是解耦和增加扩展性,用于实现对象之间的松耦合通信。
如果要自己编码实现,我们通常定义一个主题接口(Subject)和一个观察者接口(Observer)。主题接口中包含注册观察者、移除观察者和通知观察者的方法,而观察者接口中则定义了更新状态的方法。具体的主题类和观察者类实现这些接口,并进行相应的业务逻辑实现。
考虑到实现简单点,我们假定有一个广播类,这个广播类实际上就是一个主题Subject,有多个听众收听这个广播,这里每个听众就是一个观察者Observer
定义一个主题Subject的接口类
/**
* 主题,被观察者
*/
public interface Subject {
/**
* 添加观察者
*/
void addObserver(Observer observer);
/**
* 移除观察者
*/
void removeObserver(Observer observer);
/**
* 通知观察者
*/
void notifyObserver(String message);
}
定义一个观察者Observer的接口类
/**
* 观察者
*/
public interface Observer {
void recieve(String message);
}
接下来,就是定义一个广播的类,用来实现主题接口
/**
* 广播,负责向听众广播消息
*/
public class Broadcast implements Subject{
private final List<Observer> observerList = new ArrayList<>();
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserver(String message) {
for (Observer observer : observerList) {
observer.recieve(message);
}
}
}
再定义一个听众类,用来实现观察者接口
public class Audience implements Observer {
private final String name;
public Audience(String name) {
this.name = name;
}
@Override
public void recieve(String message) {
System.out.println(name + " received message: " + message);
}
}
写一个测试类来测试结果
public class Test {
public static void main(String[] args) {
Broadcast broadcast = new Broadcast();
Audience audience1 = new Audience("哈尔滨听众");
Audience audience2 = new Audience("大庆听众");
broadcast.addObserver(audience1);
broadcast.addObserver(audience2);
broadcast.notifyObserver("中央电视台黑龙江电视台");
broadcast.notifyObserver("黑龙江电视台中央电视台");
broadcast.removeObserver(audience2);
broadcast.notifyObserver("大庆听众关了广播");
}
}
结果打印如下
解释一下,广播了两拨消息,2名听众都收到了这两拨消息。后面移除了一个听众,广播了第三波消息,这时,只有剩下的那个听众收到了广播消息