首页 > 代码库 > Android设计模式(2)-----观察者模式

Android设计模式(2)-----观察者模式

观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中有四个角色:

抽象主题:它是一个接口。它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。其中有三个抽象方法:

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;
	}
	@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 = "已发货";
		}
	}
}

写到这里基本上也就写完啦,希望对大家有所帮助。

Android设计模式(2)-----观察者模式