觀察者模式是行為模式的一種,主要是用來進行消息的訂閱和通知乍狐,一個觀察者模式應(yīng)該包括4個部分赠摇,抽象主題、主題的實現(xiàn)浅蚪、抽象的觀察者藕帜、觀察者的實現(xiàn),下面我們通過搭建一個簡單的觀察者實例來解釋一下觀察者模式具體是怎么回事:
抽象主題:
abstract class abstractSubject{
//觀察者隊列
public List<abstractObserver> list;
//對所有的觀察者進行通知
public abstract void notifyObverserver(String message);
//添加觀察者
public abstract void addOberserver(abstractObserver o);
//移除觀察者
public abstract void removeObverser(abstractObserver o);
}
抽象主題的實現(xiàn):
class Subject extends abstractSubject{
public Subject(){
list = new ArrayList<abstractObserver>();
}
@Override
public void removeObverser(abstractObserver o){
list.remove(o);
}
@Override
public void notifyObverserver(String message) {
Iterator it = list.iterator();
while (it.hasNext()){
((Obverserver)(it.next())).update(message);
}
}
@Override
public void addOberserver(abstractObserver o) {
list.add(o);
}
}
抽象觀察者:
abstract class abstractObserver{
//被回調(diào)的方法,主要用來進行通知
public abstract void update(String message);
}
抽象觀察者的實現(xiàn):
class Obverserver extends abstractObserver{
public String name;
public Obverserver(String name){
this.name = name;
}
public void update(String message){
System.out.println(name + " update:" + message);
}
}
測試代碼:
abstractSubject subject = new Subject();
abstractObserver observer1 = new Obverserver("Linda");
abstractObserver observer2 = new Obverserver("Jack");
abstractObserver observer3 = new Obverserver("Peter");
subject.addOberserver(observer1);
subject.addOberserver(observer2);
subject.addOberserver(observer3);
subject.notifyObverserver("something happens");
subject.removeObverser(observer2);
subject.notifyObverserver("delete a object");
測試結(jié)果:
分析一下上面的代碼惜傲,我們定義了兩個抽象類abstractSubject和abstractObserver對觀察者和收集者的行為進行定義耘戚,隨后會對這兩個抽象類進行具體的實現(xiàn),抽象主題類中定義了一個鏈表操漠,用來添加和刪除觀察者,假如主題中發(fā)生了改變,通過遍歷觀察者鏈表浊伙,并調(diào)用觀察者的update方法來實現(xiàn)對觀察者的更新撞秋。看一下我們的測試代碼嚣鄙,我們創(chuàng)建了3個觀察者吻贿,并對所有觀察者進行通知,隨后刪除了一個觀察者哑子,并對剩下的兩個觀察者進行通知
觀察者的可以實現(xiàn)對所有的訂閱者進行統(tǒng)一的通知舅列,但是由于上面的調(diào)用是阻塞式調(diào)用,所以在鏈表很大時的效率比較低卧蜓,我們可以通過對鏈表中的元素通知進行多線程式調(diào)用從而增加通知的效率