观察者模式(Observer),定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
观察者模式又叫发布-订阅(Publish/Subscribe)模式。
观察者模式主要涉及4个部分:
- 抽象主题:它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和通知观察者对象。
- 具体主题:将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
- 抽象观察者:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体观察者:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
公交车上有很多乘客,公交到站了会广播播报站点名称,乘客在相应站点下车。在这里,我们把乘客作为抽象观察者,男乘客和女乘客是具体观察者,把起到通知到站作用的通知者作为抽象主题,广播承担了具体主题的角色。
- 通知者
public abstract class Notifier {
private List<Passenger> passengerList = new ArrayList<Passenger>();
public void add(Passenger passenger) {
passengerList.add(passenger);
}
public void notifyPassenger() {
for (Passenger passenger : passengerList) {
passenger.getOffTheBus();
}
}
}
- 广播
public class Broadcast extends Notifier {
private String stationName;
public String getStationName() {
return stationName;
}
public void setStationName(String stationName) {
this.stationName = stationName;
}
}
- 乘客
public interface Passenger {
void getOffTheBus();
}
- 女乘客
public class FemalePassenger implements Passenger {
private Broadcast broadcast;
public FemalePassenger(Broadcast broadcast) {
this.broadcast = broadcast;
}
@Override
public void getOffTheBus() {
System.out.println("female passenger get off the bus, station name is " + broadcast.getStationName());
}
}
- 男乘客
public class MalePassenger implements Passenger {
private Broadcast broadcast;
public MalePassenger(Broadcast broadcast) {
this.broadcast = broadcast;
}
@Override
public void getOffTheBus() {
System.out.println("male passenger get off the bus, station name is " + broadcast.getStationName());
}
}
- 客户端测试类
public class Client {
public static void main(String[] args) {
Broadcast broadcast = new Broadcast();
FemalePassenger femalePassenger = new FemalePassenger(broadcast);
MalePassenger malePassenger = new MalePassenger(broadcast);
broadcast.add(femalePassenger);
broadcast.add(malePassenger);
broadcast.setStationName("Zhong Shan park");
broadcast.notifyPassenger();
}
}
运行结果:
female passenger get off the bus, station name is Zhong Shan park
male passenger get off the bus, station name is Zhong Shan park
观察者模式主要解决的是一个对象状态的改变给其他对象通知的问题。一个对象(主题对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。