下面我們就來介紹一下行為型模式之一的觀察者模式。觀察者模式主要用于1對N的通知,當一個對象發生(被觀察者)改變時,它需要發出一系列的通知,告知其它的對象(觀察者)做出相應的變化。我們所熟悉的廣播就是最好的觀察者模式。 觀察者模式的主要組成: 抽象被觀察者角色:把所有對觀察者對象的引用保存在一個集合中,每個抽象主題角色都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者角色。一般用一個抽象類和接口來實現。 抽象觀察者角色:為所有具體的觀察者定義一個接口,在得到主題的通知時更新自己。 具體被觀察者察者角色:在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。具體主題角色通常用一個子類實現。 具體觀察者角色:該角色實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題的狀態相協調。通常用一個子類實現。如果需要,具體觀察者角色可以保存一個指向具體主題角色的引用。 觀察者模式適用于: 1.當一個抽象模型有兩個方面,其中一個方面依賴于另一方面。 2.當對一個對象的改變需要同時改變其它對象,而不知道具體有多少對象有待改變。 3.當一個對象必須通知其它對象,而它又不能象是誰。 下面我們就以廣播發送和接收為例: 抽象被觀察者角色SendBroadcast
/** * 抽象被觀察者角色 * 發送者也就是所謂的被觀察者 */public interface SendBroadcast { //注冊廣播,在這里當做添加廣播 void registerReceiver(BroadcastReceiver bReceiver); //取消廣播,在這里當做刪除廣播 void unregisterReceiver(BroadcastReceiver bReceiver); //通知廣播接收者 void notifyReceiver(String str);}抽象的觀察者角色BroadcastReceiver
/** * 抽象的觀察者角色 * 接收者也就是所謂的觀察者 */public interface BroadcastReceiver { String onReceive(String str);}具體的接收者(觀察者角色)ConcreteReceiver
/** * 具體的接收者(觀察者角色) */public class ConcreteReceiver implements BroadcastReceiver{ @Override public String onReceive(String str) { return str; }}具體的發送者(被觀察者角色)ConcreteSend
/** * 具體的發送者(被觀察者角色) */public class ConcreteSend implements SendBroadcast{ // 存放廣播接收者 PRivate List<BroadcastReceiver> mReceiverList = new ArrayList<BroadcastReceiver>(); @Override public void registerReceiver(BroadcastReceiver bReceiver) { mReceiverList.add(bReceiver); } @Override public void unregisterReceiver(BroadcastReceiver bReceiver) { mReceiverList.remove(bReceiver); } @Override public void notifyReceiver(String str) { for (BroadcastReceiver bReceiver : mReceiverList) { System.out.println(bReceiver+"已經收到消息---->"+bReceiver.onReceive(str)); } }}運行效果圖
觀察者模式在我們的應用中也很常見,onclick點擊事件以及onTouch等等都是所謂的觀察者模式。
新聞熱點
疑難解答