1. 程式人生 > >android進階3step2:Android App通訊 ——觀察者模式

android進階3step2:Android App通訊 ——觀察者模式

觀察者模式

一、什麼是觀察者模式?

觀察者模式即 Observer Pattern。

觀察者模式的主旨是定義物件間的一種(被 觀察者 Observable)對多(觀察者 Observer)的依賴關係,當一個物件的狀態發生改變 時,所有依賴於它的物件都得到通知並被自動更新。

因此,觀察者模式中主要有觀察者 (Observer)和被觀察者(Observable)2 種物件。

其中,被觀察者(Observable) 是個抽象類或介面只能被繼承,觀察者(Observer)並不是一個類而是一個介面, 所以觀察者可以有多個,實現了該介面的類都屬於觀察者。觀察者也可以同時是被觀察者,被觀察者同樣可以是觀察者。

二、觀察者模式用來解決哪些問題?


舉個例子,在 Android 中,我們希望資料的變化自動更新所有相關 UI,那麼這裡的資料就是一個被觀察的對,所有涉及相關資料的UI 就是多個觀察者,他們之間就 是一對多的依賴關係,並且我們希望做到“一”變化時,依賴這個“一”的“多”也能 夠同步改變。

MVC 就是觀察者模式的一個例項,在 Android 中介面控制元件的事件響應以 及 BroadcastReceiver 等都是基於觀察者模式來實現的。

三、如何使用觀察者模式?

在一個被觀察者中需要提供註冊和刪除觀察者物件的介面,觀察者需要為那些在 目標發生改變時,獲得通知的物件定義更新的介面。

四、觀察者模式使用示例及步驟:

下面是我們就利用觀察者實現 Android 中 Button 按鈕的監聽處理,Button 對 象就是我們要觀察的目標物件,setOnClickListener()方法就是註冊一個觀察者,具體 程式碼如下:

步驟 1:定義抽象的觀察者

public interface Listener {

//起到和更新一樣的用途

void onClick(); }

步驟 2:定義抽象的被觀察者

public interface Listened {

//新增觀察者
void setOnClickListener(Listener w); 
//移除觀察者
void removeClickListener(Listener w);
 //通知觀察者
void notifyClickListeners();

}

步驟 3:定義具體的觀察者繼承抽象的觀察者

public class OnClickListener implements Listener {

public void onClick() { System.out.println("又被點選了!!!");

} }

 

 

步驟 4:定義具體的被觀察者繼承自抽象的被觀察者

public class Button implements Listened {

private List<Listener> list = new ArrayList<Listener>(); 


public void setOnClickListener(Listener l) {

list.add(l); }


public void removeClickListener(Listener l) 
{ list.remove(l);

}

public void notifyClickListeners() {

for (Listener l : list) {

 l.onClick();

} }

}

步驟 5:測試類

public class Test {

public static void main(String[] args) { //建立被觀察者物件
Button btn = new Button();

//建立觀察者物件
OnClickListener clicklistener = new OnClickListener(); 

OnClickListener clicklistener2 = new OnClickListener(); 

//新增到觀察者集合中

btn.setOnClickListener(clicklistener);

btn.setOnClickListener(clicklistener2);
//呼叫通知方法
btn.notifyClickListeners();

} }