java# 设计模式# 观察者模式 及应用场景
观察者模式
观察者模式分为两端,观察者与被观察者。观察者实现接收通知接口。被观察者实现添加观察者,添加,调用通知接口。两者关系为一对多。被观察者一,观察者多。
应用场景
观察者模式,多应用于一对多的业务逻辑。且观察者与被观察者不会产生交集。使用观察者模式后方便观察者与被观察者解耦。
代码示例
// 观察者接口
public interface Observer {
public void update(String message);
}
// 观察者实现(多)
public class ConcreteObserver implements Observer {
private String name;
private String message;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
this.message = message;
this.read();
}
public void read() {
System.out.println(name + "收到消息:" + message);
}
}
// 被观察者接口
public interface Subject {
/**
* @param o 观测者
* @return void
* @Description 注册观察者
**/
public void registerObserver(Observer o);
/**
* @param o 观察者
* @return void
* @Description 删除观察者
**/
public void removeObserver(Observer o);
/**
* @param
* @return void
* @Description 通知观察这
**/
public void notifyObserver();
}
// 被观察者实现(一)
public class ConcreteSubject implements Subject {
private Vector<Observer> observers;
private String message;
public ConcreteSubject() {
observers = new Vector<>();
}
@Override
public void registerObserver(Observer o) {
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
if (!observers.isEmpty()) {
observers.remove(o);
}
}
@Override
public void notifyObserver() {
for (Observer observer : observers) {
observer.update(message);
}
}
public void send(String message) {
this.message = message;
this.notifyObserver();
}
}
扩展
在 java.util.Observer 中有现成的观察者模式。但被观察者java.util.Observable 中的观察者集合用的是Vector。涉及线程安全问题.如被观察者会涉及线程安全问题。建议使用Vector.
java.util.Observable 有意思的地方在于 接收通知时,将被观察者对象直接传给了观察者。