標籤:android 觀察者模式 android設計模式 android觀察者模式 設計模式
觀察者模式有時被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。觀察者模式中有四個角色:
抽象主題:它是一個介面。它把所有觀察者對象的引用儲存到一個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者對象。其中有三個抽象方法:
Attach()向集合裡面增加觀察者對象
Detach()從集合中刪除觀察者對象
Notify()根據主題的變化更新集合中的觀察者對象
具體主題:實現抽象主題,把狀態存入具體主題,當具體主題發生改變,發出通知更新觀察者的狀態。重寫抽象主題的三個方法:Attach()、Detach()、Notify()
抽象觀察者:為所有的觀察者定義一個抽象類別,在接到通知的時候更新自己:其中有一個抽象方法:
Update():接到通知的時候更新自己
具體觀察者:繼承抽象觀察者,重寫其要求的介面iu,更新自己,以便使自己和主題的狀態相一致。重寫父類的抽象方法:Update()
它們四者的關係可用表示:
下面讓我們來分析一個執行個體:
買東西時,顧客付錢之後,出納需要入賬、會計開票、配送員發貨這三個工作時同時進行的。
我們來看看代碼:
抽象主題:
/** * 抽象主題:它把所有觀察者對象的引用儲存到一個聚集裡,每個主題都可以有任何數量的觀察者。 *抽象主題提供一個介面,可以增加和刪除觀察者對象。 * @createTime:2014-10-28 下午3:31:44 */public interface ISubject {List<JobStation> observers = new ArrayList<JobStation>();/** * 增加觀察者 */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;}@Overridepublic void Notify() {for (JobStation o : observers) {o.Update();}}@Overridepublic void Attach(JobStation observer) {// TODO Auto-generated method stubobservers.add(observer);}@Overridepublic void Detach(JobStation observer) {// TODO Auto-generated method stubobservers.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;}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void Update() {if (customer.CustomerState().equals("已付款")) {Log.d("ccccccc", "我是配送員,我來發貨");dillivierymanState = "已發貨";}}}
寫到這裡基本上也就寫完啦,希望對大家有所協助。
Android設計模式(2)-----觀察者模式