Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android設計模式(2)-----觀察者模式

Android設計模式(2)-----觀察者模式

編輯:關於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 = "已發貨";
		}
	}
}

寫到這裡基本上也就寫完啦,希望對大家有所幫助。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved