編輯:關於Android編程
觀察者模式有時被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。觀察者模式中有四個角色:
抽象主題:它是一個接口。它把所有觀察者對象的引用保存到一個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。其中有三個抽象方法:
Attach()向集合裡面增加觀察者對象
Detach()從集合中刪除觀察者對象
Notify()根據主題的變化更新集合中的觀察者對象
具體主題:實現抽象主題,把狀態存入具體主題,當具體主題發生改變,發出通知更新觀察者的狀態。重寫抽象主題的三個方法:Attach()、Detach()、Notify()
抽象觀察者:為所有的觀察者定義一個抽象類,在接到通知的時候更新自己:其中有一個抽象方法:
Update():接到通知的時候更新自己
具體觀察者:繼承抽象觀察者,重寫其要求的接口iu,更新自己,以便使自己和主題的狀態相一致。重寫父類的抽象方法:Update()
它們四者的關系可用下圖表示:
下面讓我們來分析一個實例:
買東西時,顧客付錢之後,出納需要入賬、會計開票、配送員發貨這三個工作時同時進行的。
我們來看看代碼:
抽象主題:
/** * 抽象主題:它把所有觀察者對象的引用保存到一個聚集裡,每個主題都可以有任何數量的觀察者。 * 抽象主題提供一個接口,可以增加和刪除觀察者對象。 * @createTime:2014-10-28 下午3:31:44 */ public interface ISubject { Listobservers = new ArrayList (); /** * 增加觀察者 */ void Attach(JobStation observer); /** * 移除觀察者 */ void Detach(JobStation observer); /** * 向觀察者(們)發出通知 */ void Notify(); }
/** * 具體主題,這裡是客戶:將有關狀態存入具體觀察者對象; * 在具體主題內部狀態改變時,給所有登記過的觀察者發出通知 * * @createTime:2014-10-28 下午3:31:57 */ public class Customer implements ISubject { public String customerState; /** * 客戶狀態 */ public String CustomerState() { return customerState; } @Override public void Notify() { for (JobStation o : observers) { o.Update(); } } @Override public void Attach(JobStation observer) { // TODO Auto-generated method stub observers.add(observer); } @Override public void Detach(JobStation observer) { // TODO Auto-generated method stub observers.remove(observer); } }
/** * 工作崗位,作為這裡的抽象觀察者:為所有的具體觀察者定義一個接口,在得到主題通知時更新自己 * @createTime:2014-10-28 下午3:31:34 */ public abstract class JobStation { /** * 更新狀態 */ public abstract void Update(); }具體觀察者:出納員
/** * 出納,作為這裡的具體觀察者:實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調 * @createTime:2014-10-28 下午3:41:08 */ public class Cashier extends JobStation { private String cashierState; private Customer customer; public Cashier(Customer customer) { this.customer = customer; } @Override public void Update() { if (customer.CustomerState().equals("已付款")) { Log.d("ccccccc", "我是出納員,我給登記入賬"); cashierState = "已入賬"; } } }
/** * 會計,作為這裡的具體觀察者:實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調 * @createTime:2014-10-28 下午3:41:08 */ public class Accountant extends JobStation { private String accountantState; private Customer customer; public Accountant(Customer customer) { this.customer = customer; } @Override public void Update() { if (customer.CustomerState().equals("已付款")) { Log.d("ccccccc", "我是會計,我來開具發票"); accountantState = "已開發票"; } } }
/** * 配送員,作為這裡的具體觀察者:實現抽象觀察者角色所要求的更新接口,以便使本身的狀態與主題狀態協調 * @createTime:2014-10-28 下午3:41:08 */ public class Dilliveryman extends JobStation { private String dillivierymanState; private Customer customer; public Dilliveryman(Customer customer) { this.customer = customer; } @Override public void Update() { if (customer.CustomerState().equals("已付款")) { Log.d("ccccccc", "我是配送員,我來發貨"); dillivierymanState = "已發貨"; } } }
什麼是變量?在計算機中用來存儲信息,通過聲明語句來指明存儲位置和所需空間。變量的聲明方法及賦值分號:語句結束標志 賦值號:將=右邊的值賦給左邊的變量變量有哪些數據類型?變
策略模式的定義:定義算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。本質:分離算法,選擇實現 面向對象設計原則: 封裝變化 多用組合
之前的幾篇博客,我測試了View事件分發機制中的一些知識點,我們理解事件分發機制的目的就是為了能夠更好了知道View中事件的傳遞過程進而能夠對於滑動沖突有針對性的解決措施
AMS對startActivity請求處理及返回過程根據上一章的分析了解了調用startActivity(),終於把數據和要開啟Activity的請求發送到了AMS了,接