什么是观察者模式?
观察者模式(observer),定义了对象一对多的依赖关系。多个观察者对象监听同一个主题对象,当主题对象状态发生改变时,会通知所有观察者更新自己。
通俗的说,观察者模式就是一种发布-订阅模式。比如微信订阅号。
观察者模式由四部分组成:
- 抽象主体对象(抽象的通知者),需要取得观察者的引用,包含添加观察者、删除观察者、通知观察者方法
- 抽象观察者,有一个更新自己的方法
- 具体观察者,实现抽象观察者接口
- 具体通知者,实现抽象通知接口
观察者模式结构图
代码示例:
假设知乎关注了某一问题的场景。
一个抽象通知者接口Subject
/**
*
* 抽象通知者接口
* @Author DevinLei
*
*/
public interface Subject {
/**
* 添加通知用户
**/
void addUser(Observer obj);
/**
* 移除通知用户
**/
void deteUser(Observer obj);
/**
* 发送提醒消息
**/
void notifyUser();
}
抽象观察者接口 Observer
/**
* 抽象观察者接口
* @Author DevinLei
*/
public interface Observer {
void update(String s);
}
具体的观察者SubUser,此场景指关注了某一问题的用户
/**
* 知乎用户(具体观察者)
* @Author DevinLei
*/
public class SubUser implements Observer{
private String name;
private String message;
public SubUser(String name) {
this.name = name;
}
@Override
public void update(String mes) {
this.message = mes;
read();
}
public void read() {
System.out.println(name + " 知乎收到一条推送消息: " + message);
}
}
具体的通知者SubService,针对此场景就是知乎的订阅消息服务
/**
* 知乎订阅消息服务(具体通知者)
* @Author DevinLei
*/
public class SubService implements Subject {
private List<Observer> list;
private String message;
public SubService() {
this.list = new ArrayList<>();
}
@Override
public void addUser(Observer obj) {
list.add(obj);
}
@Override
public void deteUser(Observer obj) {
if(!list.isEmpty()){
list.remove(obj);
}
}
/**
* 遍历
**/
@Override
public void notifyUser() {
for(Observer observer :list){
observer.update(message);
}
}
public void setMessage(String mes){
this.message = mes;
// 通知观察者
notifyUser();
}
}
一个测试类:TestObserver
/**
* @Author DevinLei
*/
public class TestObserver {
public static void main(String[] args) {
/**
* 创建两个用户
**/
Observer xiaocai = new SubUser("小菜");
Observer daniao = new SubUser("大鸟");
/**
* 将用户添加到通知者的list中
**/
SubService subject = new SubService();
subject.addUser(xiaocai);
subject.addUser(daniao);
subject.setMessage("您关注的问题:观察者模式的原理?有新的回答了");
System.out.println("-----------------");
subject.deteUser(daniao);
subject.setMessage("您关注的问题:观察者模式的原理?有新的回答了");
}
}
输出结果:
小菜收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了
大鸟收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了
-----------------
小菜收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了
观察者模式的应用
spring中的监听机制就使用了观察者模式,具体参考:
https://www.cnblogs.com/esther-qing/p/9019311.html