1. 程式人生 > >android設計模式——觀察者模式

android設計模式——觀察者模式

定義:物件間一種一對多的依賴關係,使得一個物件改變狀態,則所有依賴於他的物件都會得到通知並被自動更新

使用場景

  1. 關聯行為場景。
  2. 事件多級觸發場景
  3. 跨系統的訊息交換場景。如訊息佇列,事件匯流排的處理機制。

應用舉例:觀察者訂閱被觀察者的狀態,當被觀察者狀態改變的時候會通知所有訂閱的觀察者的過程。

關鍵程式碼:在抽象類裡有一個 ArrayList 存放觀察者們。

類圖:

  1. Subject:抽象的被觀察者,把所有觀察者的引用儲存在一個集合裡,每個集合可以有任意數量的的觀察者,提供一個介面,可以增加和刪除觀察者
  2. ConcreteSubject:具體的被觀察者,實現抽象被觀察者的方法
  3. Observer:抽象的觀察者,定義一個更新介面(update方法),在被觀察者更改是通知自己
  4. ConcreteObserver:具體的觀察者,實現抽象觀察者的方法

優點:

  1. 觀察者和被觀察者是抽象耦合的。
  2. 建立一套觸發機制(訂閱系統)。

缺點:

  1. 被觀察者如果有很多觀察者的話,通知是很花費時間的
  2. 被觀察者只知道觀察者反生了變化,不知道為啥發生變化。
  3. 被觀察者和觀察者如果有迴圈呼叫的話,程式會發生崩潰。
//建立觀察者的抽象類
abstract class Observer{
	public abstract void update(String msg); 
}
//建立三個觀察者
class firstObserver extends Observer{

	@Override
	public void update(String msg) {
		// TODO 自動生成的方法存根
		System.out.println(firstObserver.class.getName()+"收到了資訊:"+msg);
	}
	
}

class secondObserver extends Observer{

	@Override
	public void update(String msg) {
		// TODO 自動生成的方法存根
		System.out.println(secondObserver.class.getName()+"收到了資訊:"+msg);
	}
	
}

class thirdObserver extends Observer{

	@Override
	public void update(String msg) {
		// TODO 自動生成的方法存根
		System.out.println(thirdObserver.class.getName()+"收到了資訊:"+msg);
	}
	
}



class Subject{
	ArrayList<Observer> observersList = new ArrayList<>();
	
	public void setMsg(String msg) {
		notifyAll(msg);
	}

	public void addAttach(Observer observer) {
		observersList.add(observer);
	}
	//通知所有的觀察者
	private void notifyAll(String msg) {
		// TODO 自動生成的方法存根
		for(Observer observer :observersList) {
			observer.update(msg);
		}
		
	}
}

主函式

public static void main(String[] args) {
		// TODO 自動生成的方法存根

		
		//建立三個觀察者
		firstObserver firstObserver = new firstObserver();
		secondObserver secondObserver = new secondObserver();
		thirdObserver thirdObserver = new thirdObserver();
		//建立被觀察者
		Subject subject = new Subject();
		subject.addAttach(firstObserver);
		subject.addAttach(secondObserver);
		subject.addAttach(thirdObserver);
		
		subject.setMsg("我要更新資訊");
		
		
	}

執行結果

從執行結果來看,一旦被觀察者(subject)有什麼動作,觀察者(observer)都會收到。