观察者模式(Observer)
观察者模式是对象的行为模式,又被叫做为模型-视图模式。这种模式定义了一种一对多的依赖关系,使多个观察者对象同时监听某个角色对象。一旦这个角色对象的状态发生了变化,就会通知所有观察者对象,使它们能够自动更新自己本身。
下面来看下观察者模式的结构,具体如下:
从上面图中可以看出,观察者模式涉及了四个角色,具体如下所示:
A、抽象实体角色:这个角色为抽象角色,它把所有的对观察者对象的引用都保存在一个聚集中,每个主题对象都可以有若干个观察者对象,主题角色又叫做抽象被观察者对象,一般用抽象类或接口表示。
同时,这个角色中含有了对观察者具体的管理方法及当主题角色发生改变时通知所有观察者对象。
B、具体实体角色:这个角色为具体实现了抽象的实体角色的具体角色。它含有了一个对实体角色状态的引用,一但实体角色改变,那么就会调用通知方法通知所有观察者对象。
C、抽象观察者对象:这个角色为所有的具体的观察者对象提供通用的接口,在得到实体变化的通知时实时的更新自己,这个角色一般用抽象类和接口来实现。
D、具体观察者对象:将有关的状态放到具体观察者对象中,在具体主题的内部的状态改变时,给所有的观察者发送通知。该角色又叫做为具体被观察者角色。
下面具体举例来说明观察者模式的使用。例子是这样的:用户现在要购买若干件同一品牌的不同款式的衣服,假如用户已经选好了不同款式的衣服,现需要实现添加到购物车并支付;支付成功之后,现在需要及时刷新用户的购物车,以便用户可以及时知道自己支付的结果,方便从新支付或挑选其他款式并支付。好了,具体需要描述完了,接下来请看功能详细类图说明:
下面直接看代码吧!我会在下面列出观察者模式的核心代码,其他请参看我上传的项目代码包,具体如下:
抽象实体角色(Cart):
/**
* @description :
* 抽象实体角色-观察者关注的对象实体
*/
public abstract class Cart {
private Vector<SalesObserver> observers = new Vector<SalesObserver>();
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(){
Enumeration<?>enumes = 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 Enumeration<?> observers() {
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;
}
}
好了,核心的代码已经贴上了,下面会列出整个流程的演示效果图:
添加购物车:
移除购物车:
支付之后效果(之前购物车和移除购物车效果相同略):
好了,到这里观察者模式已经介绍完了,希望对你有帮助,另外,原创作品来之不易,转载请注明谢谢。
技术交流群:179914858