編輯:關於Android編程
觀察者模式有時被稱作發布/訂閱模式,觀察者模式定義了一種一對多的依賴關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。觀察者模式中有四個角色:
抽象主題:它是一個接口。它把所有觀察者對象的引用保存到一個聚集裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個接口,可以增加和刪除觀察者對象。其中有三個抽象方法:
Attach()向集合裡面增加觀察者對象
Detach()從集合中刪除觀察者對象
Notify()根據主題的變化更新集合中的觀察者對象
具體主題:實現抽象主題,把狀態存入具體主題,當具體主題發生改變,發出通知更新觀察者的狀態。重寫抽象主題的三個方法:Attach()、Detach()、Notify()
抽象觀察者:為所有的觀察者定義一個抽象類,在接到通知的時候更新自己:其中有一個抽象方法:
Update():接到通知的時候更新自己
具體觀察者:繼承抽象觀察者,重寫其要求的接口iu,更新自己,以便使自己和主題的狀態相一致。重寫父類的抽象方法:Update()
它們四者的關系可用下圖表示:

下面讓我們來分析一個實例:
買東西時,顧客付錢之後,出納需要入賬、會計開票、配送員發貨這三個工作時同時進行的。
我們來看看代碼:
抽象主題:
/**
* 抽象主題:它把所有觀察者對象的引用保存到一個聚集裡,每個主題都可以有任何數量的觀察者。
* 抽象主題提供一個接口,可以增加和刪除觀察者對象。
* @createTime:2014-10-28 下午3:31:44
*/
public interface ISubject {
List observers = 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 = "已發貨";
}
}
}
Java4Android開發教程(四)java的變量
什麼是變量?在計算機中用來存儲信息,通過聲明語句來指明存儲位置和所需空間。變量的聲明方法及賦值分號:語句結束標志 賦值號:將=右邊的值賦給左邊的變量變量有哪些數據類型?變
Android 設計模式之策略模式
策略模式的定義:定義算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立於使用算法的客戶。本質:分離算法,選擇實現 面向對象設計原則: 封裝變化 多用組合
android-----滑動沖突解決案例
之前的幾篇博客,我測試了View事件分發機制中的一些知識點,我們理解事件分發機制的目的就是為了能夠更好了知道View中事件的傳遞過程進而能夠對於滑動沖突有針對性的解決措施
Android Small插件化框架--啟動插件Activity源碼解析(下)
AMS對startActivity請求處理及返回過程根據上一章的分析了解了調用startActivity(),終於把數據和要開啟Activity的請求發送到了AMS了,接