# 解决、解耦的钥匙——观察者模式 #
定义 定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都回得到通知并被自动更新。
使用场景
(1)关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系
(2)事件多级触发场景
(3)跨系统的消息交换场景,如消息队列、事件总线的处理机制
简单实现
现在有一家超市弄了一个即使通知系统每当有新菜到的时候都会通知订阅的客户前来选购。这个其实就是个
观察者模式 下面我们来看看怎么实现的
//顾客是观察者
public class Customer implements Observer{
private String name;
/**
* @param name
*/
public Customer(String name) {
super();
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println(name + arg.toString());
}
}
//超市是被观察者
public class SuperMarket extends Observable{
public void postUpdate(String content) {
//标识发生改变
setChanged();
notifyObservers(content);
}
}
//客户端调用
public class Client {
public static void main(String[] args) {
SuperMarket superMarket = new SuperMarket();
Customer customer1 = new Customer("小明");
Customer customer2 = new Customer("小红");
Customer customer3 = new Customer("小刚");
superMarket.addObserver(customer1);
superMarket.addObserver(customer2);
superMarket.addObserver(customer3);
superMarket.postUpdate("我们上新货啦 快来买吧");
}
}
下面呢看看结果就知道了
小刚我们上新货啦 快来买吧
小红我们上新货啦 快来买吧
小明我们上新货啦 快来买吧
可以看到所有订阅了超市的用户都收到了更新消息,一对多的订阅——发布系统就完成了
Observer和Observable是 JDK内置的类型,可以见得观察者模式是非常重要的。这里Observer是抽象的观察者角色
,Customer扮演的是具体观察者的角色;Observable对应的是抽象主题角色,SuperMarket则是具体的主题角色。
Customer是具体的观察者,它们订阅了SuperMarket这个具体的可观察对象,当SuperMarket有更新时会遍历所有的
观察者,然后给这些观察者发布一个更新消息,就是调用了Customer的update方法这样就达到了一对多的通知功能。
在这个过程中,通知系统都是依赖的Observer和Observable这些抽象类,因此,对于Customer和SuperMarket完全
没有耦合。