一韧掩、觀察者模式的定義
觀察者模式定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)上發(fā)生變化時俄删,會通知所有觀察者對象,使它們能夠自動更新自己奏路。
二抗蠢、模式中的角色
** 抽象主題(Subject)角色**
抽象主題角色把所有對觀察者對象的引用保存在一個聚集(比如ArrayList對象)里,每個主題都可以有任何數(shù)量的觀察者思劳。抽象主題提供一個接口迅矛,
可以增加和刪除觀察者對象,抽象主題角色又叫做抽象被觀察者(Observable)角色潜叛。
具體主題(ConcreteSubject)角色
將有關(guān)狀態(tài)存入具體觀察者對象秽褒;在具體主題的內(nèi)部狀態(tài)改變時,給所有登記過的觀察者發(fā)出通知威兜。具體主題角色又叫做具體被觀察者(Concrete Observable)角色销斟。
抽象觀察者(Observer)角色
為所有的具體觀察者定義一個接口,在得到主題的通知時更新自己椒舵,這個接口叫做更新接口蚂踊。
具體觀察者(ConcreteObserver)角色
存儲與主題的狀態(tài)自恰的狀態(tài)。具體觀察者角色實現(xiàn)抽象觀察者角色所要求的更新接口笔宿,以便使本身的狀態(tài)與主題的狀態(tài) 像協(xié)調(diào)犁钟。如果需要棱诱,具體觀察者角色可以保持一個指向具體主題對象的引用。
為了便于理解我畫了一張圖
當(dāng)然涝动,實際房子價格變化迈勋,可能是通過中介通知買房人。
三醋粟、代碼實現(xiàn)
被觀察者角色
/**
* 被觀察者
* @author dell
*
*/
public class Subject {
List<Oberser> observers = new ArrayList<Oberser>();
public void attach(Oberser o){
observers.add(o);
}
public void detach(Oberser o){
observers.remove(o);
}
public void notifyObserver(String content){
for (Oberser ob : observers) {
ob.update(content);
}
}
}
抽象觀察者角色
/**
* 抽象觀察者
* @author dell
*
*/
public abstract class Oberser {
abstract void update(String content);
}
具體觀察者
package com.wzc.observer;
public class ConcretOberser extends Oberser{
private String name;
public ConcretOberser(String name) {
this.name = name;
}
@Override
void update(String content) {
System.out.println(name +":"+ content);
}
}
main函數(shù)中調(diào)用
public class Client {
public static void main(String[] args) {
Subject sb = new Subject();
ConcretOberser concretOberser1 = new ConcretOberser("concretOberser1");
ConcretOberser concretOberser2 = new ConcretOberser("concretOberser2");
ConcretOberser concretOberser3 = new ConcretOberser("concretOberser1");
sb.attach(concretOberser1);
sb.attach(concretOberser2);
sb.attach(concretOberser3);
sb.notifyObserver("被觀察者更新了"); //通知所有觀察者 被觀察者更新了
}
}
四靡菇、結(jié)語
觀察者模式使用很廣泛,以前接觸過一個Android項目米愿,整個項目只有一個Activity,沒有Fragment厦凤,就是用這個模式實現(xiàn)的。這個模式要好好把握育苟。