本文将会从定义,类图,案例等几个方面对观察者模式进行说明:
定义
观察者模式:定义了一种一对多的依赖关系,一个主题对象可以同时被多个观察者对象同时监听,使得每当主题对象状态发生变化时,所有依赖它的对象都会得到通知并自动更新,属于行为者模式。
观察模式又叫做发布-订阅模式,模型-视图模式,源-监听模式或从属者模式,其核心是将观察者和被观察者解耦。
类图
根据类图给出模板代码:
public interface Subject {
/**主题接口*/
void attach(Observer o);
void detach(Observer o);
void notify(Message m);
}
public interface Observer {
/**观察者接口*/
void update(Message message);
}
public class ConcreteSubject implements Subject {
/**具体主题生产者*/
private List<Observer> observers = new ArrayList<Observer>();
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notify(Message message) {
for(Observer observer: observers){
observer.update(message);
}
}
}
public class ConcreteObserver implements Observer{
/**具体观察者**/
@Override
public void update(Message message) {
//根据实际情况编写
}
}
public class Message {
/**消息,这里简写*/
}
public class Client {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
subject.attach(new ConcreteObserver());
subject.notify();
}
}
案例
1:JDK自带的Observable和Observer实现观察者模式
gihub地址:https://github.com/siweidetu/DesignPattern/tree/master/gper
参考书籍:《设计模式就该这样学:基于经典框架源码和真实业务场景》
2: Guava实现观察者模式
gihub地址:https://github.com/siweidetu/DesignPattern/tree/master/guava
gihub地址:https://github.com/siweidetu/DesignPattern/tree/master/guava2
参考书籍:《设计模式之美》
3: javascript观察者模式
gihub地址:https://github.com/siweidetu/DesignPattern/blob/master/scripts/observer
参考书籍:《javascript设计模式》
总结:
文中的案例会不断的完善,从更多的角度去分析,增加对这种模式的理解,落实到实践中。