定義:定義對象間一種對多種的依賴關(guān)系,使得每當一個對象改變狀態(tài),則所有依賴它的對象都會得到通知并被自動更新
觀察者模式是一種常見的模式,常見的BroadCast和EventBus都是觀察者模式.
他們都有注冊的過程,post來通知改變,然后所有的觀察者都能被通知到.其實平時我們使用的setOnclicklistener也是觀察者模式,?只不過他是單對單的觀察者模式.
觀察者模式的UML圖為下(不拘泥于UML圖,僅供參考)

573860a9g75c0ec0401ba&690&690.gif
觀察者模式中得幾種角色
- ?Suject:抽象主題,也就是被觀察(Observable)的角色,抽象主題把所有觀察者對象的引用保存在一個集合里,每個主題都可以有任意數(shù)量的觀察者,抽象主題提供一個借口,可以增加和刪除觀察者對象。
- Observer:抽象觀察者,該角色是觀察者的抽象類,它定義了一個更新接口,使得在得到主題的更改通知時更新自己
- ConcreteSubject:?具體主題,當被觀察者發(fā)生變化的時候,給注冊過的觀察者發(fā)出通知.
- ConcreteObserver:具體的觀察者,接受到通知后,更新自己的狀態(tài)
下面貼出示例代碼
//抽象觀察者角色
public interface Watcher
{
public void update(String str);
}
//具體觀察者角色
public class ConcreteWatcher implements Watcher
{
@Override
public void update(String str)
{
System.out.println(str);
}
}
//抽象主題角色,也是被觀察角色
public interface Watched
{
public void addWatcher(Watcher watcher);
public void removeWatcher(Watcher watcher);
public void notifyWatchers(String str);
}
//具體被觀察者
public class ConcreteWatched implements Watched
{
// 存放觀察者
private List<Watcher> list = new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watcher)
{
list.add(watcher);
}
@Override
public void removeWatcher(Watcher watcher)
{
list.remove(watcher);
}
@Override
public void notifyWatchers(String str)
{
// 自動調(diào)用實際上是主題進行調(diào)用的
for (Watcher watcher : list)
{
watcher.update(str);
}
}
}
public class Test
{
public static void main(String[] args)
{
Watched girl = new ConcreteWatched();
Watcher watcher1 = new ConcreteWatcher();
Watcher watcher2 = new ConcreteWatcher();
Watcher watcher3 = new ConcreteWatcher();
girl.addWatcher(watcher1);
girl.addWatcher(watcher2);
girl.addWatcher(watcher3);
girl.notifyWatchers("開心");
}
}
上述示例代碼來自博客