定義:定義對(duì)象間一種對(duì)多種的依賴關(guān)系,使得每當(dāng)一個(gè)對(duì)象改變狀態(tài),則所有依賴它的對(duì)象都會(huì)得到通知并被自動(dòng)更新
觀察者模式是一種常見的模式,常見的BroadCast和EventBus都是觀察者模式.
他們都有注冊(cè)的過(guò)程,post來(lái)通知改變,然后所有的觀察者都能被通知到.其實(shí)平時(shí)我們使用的setOnclicklistener也是觀察者模式,?只不過(guò)他是單對(duì)單的觀察者模式.
觀察者模式的UML圖為下(不拘泥于UML圖,僅供參考)
觀察者模式中得幾種角色
- ?Suject:抽象主題,也就是被觀察(Observable)的角色,抽象主題把所有觀察者對(duì)象的引用保存在一個(gè)集合里,每個(gè)主題都可以有任意數(shù)量的觀察者奔坟,抽象主題提供一個(gè)借口,可以增加和刪除觀察者對(duì)象蒲凶。
- Observer:抽象觀察者觅闽,該角色是觀察者的抽象類,它定義了一個(gè)更新接口,使得在得到主題的更改通知時(shí)更新自己
- ConcreteSubject:?具體主題,當(dāng)被觀察者發(fā)生變化的時(shí)候,給注冊(cè)過(guò)的觀察者發(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)
{
// 自動(dòng)調(diào)用實(shí)際上是主題進(jìn)行調(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("開心");
}
}
上述示例代碼來(lái)自博客