简介
观察者模式,又可以称之为发布-订阅模式,观察者,顾名思义,就是一个监听者,类似监听器的存在,一旦被观察/监听的目标发生的情况,就会被监听者发现
实际应用场景
观察者模式多用于实现订阅功能的场景,例如微博的订阅
UML
代码实现
/**
* 主题
* @author liuyongtao
* @since 2021-3-5 9:26
*/
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObserver();
}
/**
* 实现主题
*
* @author liuyongtao
* @since 2021-3-5 9:31
*/
public class OrderSubject implements Subject {
String msg;
List<Observer> observers = new ArrayList<>();
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
System.out.println(observer.getName() + "===>>> 取消关注了...");
}
@Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.update(msg);
}
}
public void setMsg(String msg) {
this.msg = msg;
this.notifyObserver();
}
}
/**
* 观察者
*
* @author liuyongtao
* @since 2021-3-5 9:27
*/
public interface Observer {
String getName();
void update(String msg);
}
/**
* 观察实现
*
* @author liuyongtao
* @since 2021-3-5 9:35
*/
public class OrderObserver implements Observer {
private String name;
public OrderObserver(String name) {
this.name = name;
}
@Override
public String getName() {
return name;
}
@Override
public void update(String msg) {
System.out.println(name + "===>>> 执行具体业务:===>>>" + msg);
}
}
/**
* 测试
*
* @author liuyongtao
* @since 2021-3-5 9:37
*/
public class Main {
public static void main(String[] args) {
OrderSubject orderSubject = new OrderSubject();
OrderObserver orderObserver = new OrderObserver("AA");
OrderObserver orderObserver2 = new OrderObserver("BB");
orderSubject.registerObserver(orderObserver);
orderSubject.registerObserver(orderObserver2);
orderSubject.setMsg("今天查水表");
orderSubject.removeObserver(orderObserver2);
orderSubject.setMsg("今天还要查水表");
}
}