观察者模式 (Observer)
观察者属于行为型模式,其目的就是定义对象间的一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
画图简单分析一下观察者模式一步一步的演化过程:
1、图一,最简单的两个观察者A、B监听一个主题Subject;
2、由于主题直接耦合观察者,因此产生了图二模式;
3、由于图二中主题不具有复用性,因此产生了图三模式;
4、形成最终版,其中:
Subject:被观察的对象接口,一个Subject可以有多个IObserver;
NewsPublisher:具体被观察对象,状态发生改变时会发送通知给所有注册的观察者;
IObserver:观察者接口,在被观察对象发生改变时被调用;
Customer、TV:具体观察者。
具体代码
//观察者接口
public interface IObserver {
void update(Subject subject,Object args);
}
public class Customer implements IObserver {
@Override
public void update(Subject subject, Object args) {
System.out.println("Customer 获得了新消息 ["+ args +"]");
}
}
public class TV implements IObserver {
@Override
public void update(Subject subject, Object args) {
System.out.println("TV 获得了新消息 ["+ args +"]");
}
}
public abstract class Subject {
private Vector<IObserver> observers;
public Subject(){
observers = new Vector<>();
}
//增加监听器
public synchronized void addObserver(IObserver observer){
observers.add(observer);
}
//删除监听器
public synchronized void removeObserver(IObserver observer){
observers.remove(observer);
}
//删除所有监听器
public synchronized void removeObservers(IObserver observer){
observers.clear();
}
//通知方法
public synchronized void notifyObservers(Object args){
for(IObserver observer : observers){
observer.update(this,args);
}
}
}
public class NewsPublisher extends Subject{
private String news;
public void setNews(String news) {
this.news = news;
//通知监听器
this.notifyObservers(news);
}
}
public class Client {
public static void main(String[] args) {
NewsPublisher newsPublisher = new NewsPublisher();
//增加监听器
newsPublisher.addObserver(new TV());
newsPublisher.addObserver(new Customer());
//改变主题内容
newsPublisher.setNews("北京今天下雪了");
}
}
测试结果
总结
观察者模式适用于一对多的依赖关系,其中一个对象状态的改变将影响所有其他对象。