观察者模式介绍
观察者模式归类于行为模式,亦可称为发布订阅模式。观察者模式,即多个观察者监听某一主题对象,当对象存在变化时,就会通知所有的观察者。
代码实现
public interface Observerable {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
public interface Observer {
void update(String msg);
}
// 观察者StudentA
public class StudentA implements Observer {
public StudentA(){}
public StudentA(Observerable observerable) {
observerable.attach(this);
}
@Override
public void update(String msg) {
System.out.println("studentA receive message is:" + msg);
}
}
// 观察者StudentB
public class StudentB implements Observer {
public StudentB(){}
public StudentB(Observerable observerable) {
observerable.attach(this);
}
@Override
public void update(String msg) {
System.out.println("StudentB receive message is:" + msg);
}
}
public class MessageServer implements Observerable {
private List<Observer> observerList = new LinkedList<>();
// 被大家一起监听的资源
private String message = "init";
@Override
public void attach(Observer observer) {
if (!observerList.contains(observer)) {
observerList.add(observer);
}
}
@Override
public void detach(Observer observer) {
observerList.remove(observer);
}
public void sendMessage(String message){
this.message = message;
notifyObservers();
}
@Override
public void notifyObservers() {
for (Observer item: observerList){
item.update(message);
}
}
}
public class Main {
public static void main(String[] args){
MessageServer messageServer = new MessageServer();
StudentA a = new StudentA(messageServer);
StudentB b = new StudentB(messageServer);
messageServer.sendMessage("first");
messageServer.detach(a);
System.out.println("-----------------------------------");
messageServer.sendMessage("second");
messageServer.detach(b);
System.out.println("-----------------------------------");
messageServer.sendMessage("third");
}
}
输出信息是:
studentA receive message is:first
StudentB receive message is:first
-----------------------------------
StudentB receive message is:second
-----------------------------------
StudentA和StudentB是两个观察者,MessageServer是被观察者。当被观察者中被监听的对象发生变化时,将会通知StudentA和StudentB两个观察者。
思考问题
- 观察者设计模式,使用了一个List存储了所有的观察者,那么在分布式场景,怎么使用观察者模式?
- update通知观察者采用异步执行方式,会不会对性能有所提升?
- 移除观察者,没有上锁,在多线程场景中,会不会出现问题?