android進階3step2:Android App通訊 ——觀察者模式
阿新 • • 發佈:2018-11-27
觀察者模式
一、什麼是觀察者模式?
觀察者模式即 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();
} }