編輯:關於Android編程
觀察者模式(Observer)
觀察者模式是對象的行為模式,又被叫做為模型-視圖模式。這種模式定義了一種一對多的依賴關系,使多個觀察者對象同時監聽某個角色對象。一旦這個角色對象的狀態發生了變化,就會通知所有觀察者對象,使它們能夠自動更新自己本身。
下面來看下觀察者模式的結構,具體如下:
從上面圖中可以看出,觀察者模式涉及了四個角色,具體如下所示:
A、抽象實體角色:這個角色為抽象角色,它把所有的對觀察者對象的引用都保存在一個聚集中,每個主題對象都可以有若干個觀察者對象,主題角色又叫做抽象被觀察者對象,一般用抽象類或接口表示。
同時,這個角色中含有了對觀察者具體的管理方法及當主題角色發生改變時通知所有觀察者對象。
B、具體實體角色:這個角色為具體實現了抽象的實體角色的具體角色。它含有了一個對實體角色狀態的引用,一但實體角色改變,那麼就會調用通知方法通知所有觀察者對象。
C、抽象觀察者對象:這個角色為所有的具體的觀察者對象提供通用的接口,在得到實體變化的通知時實時的更新自己,這個角色一般用抽象類和接口來實現。
D、具體觀察者對象:將有關的狀態放到具體觀察者對象中,在具體主題的內部的狀態改變時,給所有的觀察者發送通知。該角色又叫做為具體被觀察者角色。
下面具體舉例來說明觀察者模式的使用。例子是這樣的:用戶現在要購買若干件同一品牌的不同款式的衣服,假如用戶已經選好了不同款式的衣服,現需要實現添加到購物車並支付;支付成功之後,現在需要及時刷新用戶的購物車,以便用戶可以及時知道自己支付的結果,方便從新支付或挑選其他款式並支付。好了,具體需要描述完了,接下來請看功能詳細類圖說明:
下面直接看代碼吧!我會在下面列出觀察者模式的核心代碼,其他請參看我上傳的項目代碼包,具體如下:
抽象實體角色(Cart):
/**
* @description :
* 抽象實體角色-觀察者關注的對象實體
*/
public abstract class Cart {
private Vector
public Cart() {
super();
}
/**
* @description :
* 登記一個觀察者對象
*/
public voidattach(SalesObserver observer) {
observers.addElement(observer);
}
/**
* @description :
* 刪除一個已經登記的觀察者對象
*/
public voiddetach(SalesObserver observer) {
observers.removeElement(observer);
}
public void detach(int index) {
observers.remove(index);
}
/**
* @description :
* 通知所有已經登記過的觀察者對象
*/
public void notifyAllBills(){
Enumerationenumes = observers();
while(enumes.hasMoreElements()){
SalesObserverobj = (SalesObserver)enumes.nextElement();
obj.updateSale(obj);
}
}
/**
* @description :
* 支付成功之後,更新購物車內的所有商品的支付狀態
* 注意:這裡更新的是本地緩存數據(不通過接口更新)
*/
public booleanbillsPay() {
boolean payStatus = true;
// 異步網絡支付
// TODO
// 這裡模擬支付成功
if(payStatus) {
// 更新本地緩存數據
updateLocalCache();
}
return true;
}
/**
* @description :
* 更新緩存
*/
private voidupdateLocalCache() {
for(SalesObserver obs : observers) {
Salesale = obs.getSale();
sale.setPayStatus(支付完成);
}
}
public Enumerationobservers() {
return observers.elements();
}
}
具體實體角色(ShoppingCart):
/**
* @description :
* 具體的實體角色-具體通知各個觀察者對象更新狀態
*/
public class ShoppingCart extends Cart {
public ShoppingCart() {
super();
}
protected void billPayResult(boolean flag) {
if(!flag) {
// 支付失敗提示(這裡不考慮這種情況)
return;
}
// notify obervers
notifyAllBills();
}
}
抽象觀察者角色(Observer):
/**
* @description :
* 抽象觀察者-為所有具體觀察者提供更新方法
*/
public interface Observer{
public Object updateSale(Object obj);
}
具體觀察者角色(SalesObserver):
/**
* @description :
* 具體觀察者-具體執行更改狀態的操作
*/
public class SalesObserver implements Observer {
private Sale sale = null;
public SalesObserver(Sale sale) {
this.sale = sale;
}
@Override
public Object updateSale(Object obj) {
this.sale = (Sale) obj;
return sale;
}
public Sale getSale() {
return sale;
}
public void setSale(Sale sale) {
this.sale = sale;
}
}
好了,核心的代碼已經貼上了,下面會列出整個流程的演示效果圖:
添加購物車:
移除購物車:
支付之後效果(之前購物車和移除購物車效果相同略):
先看下利用wheelview實現滾動隨機選擇號碼效果:直接上代碼 首頁就是dialog顯示不在描述 主要看dialog代碼package com.yskj.jh.whee
這倆天讀Google關於Android下Media開發的Sample,Media相關類庫結構復雜,時序難以理解,所以操起個人最喜歡的“看代碼”工具
1. 什麼是服務: Android中的四大組件, 是一個可以長時間在後台運行的不提供用戶界面的一個類. 2.服務的特性: 服務一旦被啟動無論啟動它的界面還存不存
先看看效果圖:activity_main.xml <RelativeLayout xmlns:android=http://schemas.android