java 接口的观察者模式_java观察者模式
觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式。
觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會通知所有觀察者對象,使它們能夠自己更新自己。
Observer結(jié)構(gòu)圖.png
Subject類,可翻譯成為主題或抽象通知者,一般用一個抽象類或者一個接口實現(xiàn)。它把所有對觀察者對象的引用保存在一個集合里,每個主題都可以有任何數(shù)量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。
interface Subject {
//添加觀察者
void addObserver(Observer obj);
//移除觀察者
void deleteObserver(Observer obj);
//當主題方法改變時,這個方法被調(diào)用,通知所有的觀察者
void notifyObserver();
}
Observer類,抽象觀察者,為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己,這個接口叫做更新接口。抽象觀察者一般用一個抽象類或者一個接口實現(xiàn),更新接口通常包含一個Update()方法,這個方法叫做更新方法。
interface Observer {
public void update();
}
ConcreteSubject類,叫做具體主題或具體通知者,將有關(guān)狀態(tài)存入具體觀察者對象,在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知。這里舉例老師給學生布置作業(yè)。
public class TeacherSubject implements Subject {
//用來存放和記錄觀察者
private List observers=new ArrayList();
//記錄狀態(tài)的字符串
private String info;
@Override
public void addObserver(Observer obj) {
observers.add(obj);
}
@Override
public void deleteObserver(Observer obj) {
int i = observers.indexOf(obj);
if(i>=0){
observers.remove(obj);
}
}
@Override
public void notifyObserver() {
for (Observer observer:observers) {
observer.update();
}
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
ConcreteObserver類,具體觀察者,實現(xiàn)抽象觀察者角色所要求的更新接口,以便使本身的狀態(tài)與主題狀態(tài)相協(xié)調(diào),具體觀察者角色可以保存一個指向具體主題對象的引用。
public class StudentObserver implements Observer {
//保存一個Subject的引用,以后如果可以想取消訂閱,有了這個引用會比較方便
private TeacherSubject teacher;
//學生的姓名,用來標識不同的學生對象
private String name;
//構(gòu)造器用來注冊觀察者
public StudentObserver(String name,TeacherSubject teacher) {
this.name=name;
this.teacher = teacher;
//每新建一個學生對象,默認添加到觀察者的行列
teacher.addObserver(this);
}
@Override
public void update() {
System.out.println(name+"得到作業(yè):"+teacher.getInfo());
}
}
測試用例
public class TestObserver {
public static void main(String []args) throws Exception {
TeacherSubject teacher=new TeacherSubject();
StudentObserver jack=new StudentObserver("jack",teacher);
StudentObserver mark=new StudentObserver("mark",teacher);
teacher.setInfo("測試題1");
teacher.notifyObserver();
teacher.setInfo("測試題2");
teacher.deleteObserver(jack);
teacher.notifyObserver();
}
}
輸出結(jié)果
jack得到作業(yè):測試題1
mark得到作業(yè):測試題1
mark得到作業(yè):測試題2
觀察者模式在android中的應用
首先在Android中,我們往ListView添加數(shù)據(jù)后,都會調(diào)用Adapter的notifyDataChanged()方法,其中使用了觀察者模式。
當ListView的數(shù)據(jù)發(fā)生變化時,調(diào)用Adapter的notifyDataSetChanged函數(shù),這個函數(shù)又會調(diào)用DataSetObservable的notifyChanged函數(shù),這個函數(shù)會調(diào)用所有觀察者(AdapterDataSetObserver)的onChanged方法,在onChanged函數(shù)中又會調(diào)用ListView重新布局的函數(shù)使得ListView刷新界面。
總結(jié)
以上是生活随笔為你收集整理的java 接口的观察者模式_java观察者模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone 13来了,iPhone 1
- 下一篇: java堆和客栈_java中堆和栈的区别