定義
定義了對象之間的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新。
角色
抽象主題(ISubject)
定義主題中的要實現的方法,包括保存所有的觀察者,觀察者註冊,取消註冊(增刪)等。
主題類(ConcreteSubject)
實現了抽象主題中的具體方法。
抽象觀察者(IObserver)
定義觀察者要實現的方法,比如:更新,修改,回滾,顯示等方法。
觀察者類(ConcreteObserver)
實現抽象觀察者中的具體方法。
類圖
示例
觀察者模式算是比較好理解的一種模式。簡單示例如下:
public interface ISubject{
void addObserver(IObserver obs);
void delObserver(IObserver obs);
void removerAll();
void notifyAll();
public class Subject implements ISubject{
List<IObserver> observerList = new ArraryList<IObserver>();
private int count;
void addObserver(IObserver obs)
{
observerList .add(obs);
}
void delObserver(IObserver obs)
{
observerList .remover(obs);
}
void removerAll()
{
observerList.clear();
}
public void notifyAll()
{
for(IObserver obs:allObserver)
{
obs.update(count);
obs.display(count);
}
}
public void setChange(int count)
{
this.count = count;
notifyAll();
}
public interface IObserver()
{
boolean update(int count);
boolean display(int count);
}
public class Observer implements IObserver
{
private Subject subject = null;
public Observer(Subject sub)
{
this.subject = sub;
subject.addObserver(this);
}
private IDataDao dataDao = new DataDao();
public boolean update(int count)
{
dataDao.update(count); //假設更新數據庫
}
public boolean display(int count)
{
System.out.println("display " + count);
}
}
public class Test {
public static void main(String[] args){
Subject subject = new Subject();
Observer observer = new Observer(subject);
int count = 20;
subject.setChange(count);
int count2 = 30;
subject.setChange(count2);
}
}
要點
1.定義了對象之間一對多的關係
2.觀察者和可觀察者之間用鬆耦合方式結合,可觀察者不知道觀察者的細節,只知道觀察者實現了接口中的方法
3.有多個觀察者時,不可以依賴特定的統治次序