一、什么是观察者模式
观察者模式体现了一对多的对象关系,即主题(一)和观察者(多),当主题发生改变时,会通知每一个观察者,主题负责消息的发送,观察者默默的接收消息。观察者和主题是松耦合的,移除任何一个观察者都不会对主题产生影响。java.uitl.Observer(观察者)和 Observable(主题)实现了此模式。每一个观察者即可以是观察者也可以是主题,主题也是如此,这要看它都实现了那些接口。
二、观察者模式解决了什么问题
观察者模式解决了对象之间紧耦合的问题,观察者模式使我们可以进一步的解耦合。
三、观察者模式思图
来自《headfirst设计模式》
四、观察者模式使用示例
区分观察者和主题的办法是主题实现了主题接口
定义主题接口
package 设计模式.观察者模式;
/*
创建一个主题,
*/
public interface Theme {
/*定义添加观察者的方法*/
void addObserver(Observer observer);
/*定义移除观察者的方法*/
void deleteObserver(Observer observer);
/*定义通知观察者的方法*/
void noticeObserver();
/*定义观察者主动获取数据的方法*/
Object getData();
}
实现一个主题
package 设计模式.观察者模式;
import java.util.ArrayList;
import java.util.List;
public class Newspaper implements Theme {
/*观察者们在这里...*/
private List<Observer> observers;
/*模拟的数据*/
private String data = "有内鬼,终止交...";
/*默认使用ArrayList存储*/
public Newspaper(){
this.observers = new ArrayList<>();
}
/*也可以指定*/
public Newspaper(List list){
this.observers = list;
}
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void noticeObserver() {
for (Observer observer : observers){
observer.receiveData(data);
}
}
@Override
public Object getData() {
return data;
}
}
区分观察者和主题的办法是观察者实现了观察者接口
定义观察者接口
package 设计模式.观察者模式;
/*观察者接口*/
public interface Observer {
/*申请成为观察者*/
void becomeObserver();
/*接收主题发送来的数据*/
void receiveData(Object o);
/*将自己从主题中移除*/
void removeYourself();
/*主动获取主题中的数据*/
void getData();
/*展示数据*/
void showData();
}
实现一个观察者
package 设计模式.观察者模式;
public class subscriber implements Observer {
/*指定观察者*/
private Theme theme;
/*模拟接收到的数据*/
private Object data;
public subscriber(Theme theme){
this.theme=theme;
}
@Override
public void becomeObserver() {
theme.addObserver(this);
}
@Override
public void receiveData(Object o) {
this.data=o;
}
@Override
public void removeYourself() {
theme.deleteObserver(this);
}
@Override
public void getData() {
this.data = theme.getData();
showData();
}
@Override
public void showData() {
System.out.println("我是观察者一号,我接收到的消息:"+data);
}
}
五、观察者模式的设计原则
为对象之间的松耦合设计而努力
六、关键词
一对多 订阅 取消订阅