生活中我們經常遇到觀察者模式的案例。
例如,我們去商場購物,注冊了一家店的會員,一旦這家店有活動,你的手機就會收到一些推送消息,是不是?
在例如,我們看某個電視台的節目,這個電視台放什么節目我們就會看到什么節目。
這些都是典型的生產者與消費者的案例。
所謂的觀察者模式,定義了一種一對多的依賴關系,能夠讓多個觀察者訂閱某個主題,當這個主題發生變化的時候,主題會通知這些訂閱者,那么觀察者就會自動更新變化。
我們以天氣預告為例,tom和jack,都訂閱了手機天氣預告功能,那么天氣預告會每天進行通知tom和jack,tom和jack就會收到天氣預報,一旦天氣預報發生變化,tom和jack也會收到這些通知。
下面看具體實現。
//===========Observer.java===============
//抽象類,觀察者,具體的觀察這將到子類實現
public abstract class Observer {
public abstract void update();
}
//===========Subject.java===============
//主題
public class Subject {
//保存多個觀察者(就是訂閱該主題的人)
private List<Observer> observers=new ArrayList<Observer>();
/**
* 增加觀察者
* @param observer
*/
public void addObserver(Observer observer){
observers.add(observer);
}
/**
* 移除觀察者
* @param observer
*/
public void removeObserver(Observer observer){
observers.remove(observer);
}
/**
* 通知觀察者
*/
public void notifyObserver(){
for (Observer observer : observers) {
observer.update();
}
}
}
//===========ConcreteSubject.java===============
//具體的某個主題
public class ConcreteSubject extends Subject {
//主題消息內容
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
}
}
//===========ConcreteObserver.java===============
//具體的某個觀察者
public class ConcreteObserver extends Observer {
private String name;
private String observerState;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name){
this.subject=subject;
this.name=name;
}
@Override
public void update() {
observerState=subject.getSubjectState();
System.out.println(String.format("%s的收到消息,內容是:%s", name,observerState));
}
}
//===========MainTest.java===============
public static void main(String[] args) {
//主題
ConcreteSubject subject=new ConcreteSubject();
//tom訂閱主題
subject.addObserver(new ConcreteObserver(subject, "tom"));
//jack訂閱主題
subject.addObserver(new ConcreteObserver(subject, "jack"));
//編寫主題內容
subject.setSubjectState("今天下雨");
//發布主題,所有訂閱主題的人都收到了
subject.notifyObserver();
//編寫主題內容
subject.setSubjectState("根據最新氣象顯示,今天大部分地區將是雨轉多雲");
//發布主題,所有訂閱主題的人都收到了
subject.notifyObserver();
}
我們看結果:
tom的收到消息,內容是:今天下雨
jack的收到消息,內容是:今天下雨
tom的收到消息,內容是:根據最新氣象顯示,今天大部分地區將是雨轉多雲
jack的收到消息,內容是:根據最新氣象顯示,今天大部分地區將是雨轉多雲
easy吧,完!