观察者模式
Posted Ronaldo7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。
观察者模式
定义
对象之间定义一对多的依赖,当一
这个对象状态发生变化,它所依赖的对象都能得到变化后的状态值。(简单的来说,就类似消息系统的发布订阅模式。其中消息系统中的消费者
就是观察者
,消息系统中的生产者
就是被观察者。当生产者的状态发生变化,那么订阅该消息的消费者就将全部接收到变化的信息)
类图
说明
由UML可以看出,该模式由四个对象组成:
- 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
- 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
- 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
- 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。
代码实现
- Subject
public interface Subject {
void initMsg(String msg);
public void addObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObserver();
}
- Observer
public interface Observer {
public void updateMsg(String msg);
}
- MsgSubject
public class MsgSubject implements Subject {
private List<Observer> observerList = new ArrayList<>();
private String msg;
@Override
public void initMsg(String msg) {
this.msg = msg;
System.out.println("收到消息:" + this.msg);
// 通知观察者
this.notifyObserver();
}
@Override
public void addObserver(Observer observer) {
this.observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
this.observerList.remove(observer);
}
@Override
public void notifyObserver() {
observerList.forEach(o -> {
o.updateMsg(this.msg);
});
}
- MsgObserver
public class MsgObserver implements Observer {
private String userName;
public MsgObserver(String userName) {
this.userName = userName;
}
@Override
public void updateMsg(String msg) {
System.out.println(userName + "收到消息: " + msg);
}
public int hashCode() {
return super.hashCode();
}
public boolean equals(Object obj) {
return super.equals(obj);
}
public String toString() {
return super.toString();
}
}
- 测试
public static void main(String[] args) {
Observer observer = new MsgObserver("a");
Observer observer1 = new MsgObserver("b");
Observer observer2 = new MsgObserver("c");
Subject subject = new MsgSubject();
subject.addObserver(observer);
subject.addObserver(observer1);
subject.addObserver(observer2);
subject.initMsg("sds");
subject.removeObserver(observer1);
subject.initMsg("adsd");
}
收到消息:sds
a收到消息: sds
b收到消息: sds
c收到消息: sds
收到消息:adsd
a收到消息: adsd
c收到消息: adsd
以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java设计模式补充:回调模式事件监听器模式观察者模式(转)