观察者模式

观察者模式

定义

观察者模式又称为发布/订阅(Publish/Subscribe)模式。它定义了一种一对多的依赖关系,多个观察者对象可同时监听某一主题对象当该主题对象状态发生变化时,相应的所有观察者对象都可以收到通知。

角色划分

<>(观察者关注的事件)
  + update(Event event)
Observer1
  + update(Event event)
Observer2
  + update(Event event)

AbstractSubject
  allObserver:Collection
  + addObserver(Observer observer)
  + removeObserver(Observer observer)
  + notifyObserver(Event event):void
Subject1
  + addObserver(Observer observer)
  + removeObserver(Observer observer)
  + notifyObserver(Event event):void
Subject2
  + addObserver(Observer observer)
  + removeObserver(Observer observer)
  + notifyObserver(Event event):void
观察者模式角色划分
  主题,抽象类或接口,如上面类图中的AbstractSubject
  具体主题,如上面类图中的Subject1,Subject2
  观察者,如上面类图中的IObserver
  具体观察者,如上面类图中的Observer1,Observer2

示列代码

//观察者接口
public interface Observer {
    public void update(String message);
}
/**
 * 具体观察者
 * 实现了update方法
*/
public class User implements Observer {
    private String name;
    private String message;
    public User(String name) {
        this.name = name;
    }
    //得到通知之后所作出的反应
    @Override
    public void update(String message) {
        this.message = message;
        read();
    }
    public void read() {
        System.out.println(name + " 收到推送消息: " + message);
    } 
}
public interface Subject{ 
    public void registerObserver(Observer o);
    public void removeObserver(Observer o);
    public void notifyObserver();
    
}
/**
 * 被观察者,也就是微信公众号服务
 * 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
 * @author jstao
 *
 */
public class WechatSubject implements Subject{
    
    //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
    private List<Observer> list;
    private String message;
    
    public WechatSubject() {
        list = new ArrayList<Observer>();
    }
    //添加观察者
    @Override
    public void registerObserver(Observer o) {
        list.add(o);
    }
    //删除观察者
    @Override
    public void removeObserver(Observer o) {
        if(!list.isEmpty())
            list.remove(o);
    }
    //遍历通知
    @Override
    public void notifyObserver() {
        for(int i = 0; i < list.size(); i++) {
            Observer oserver = list.get(i);
            //通知具体的观察者
            oserver.update(message);
        }
    } 
    public void setInfomation(String s) {
        this.message = s;
        System.out.println("微信服务更新消息: " + s);
        //消息更新,通知所有观察者
        notifyObserver();
    }
}

优缺点

观察者模式优点
  抽象主题只依赖于抽象观察者
  观察者模式支持广播通信
  观察者模式使信息产生层和响应层分离
观察者模式缺点
  如一个主题被大量观察者注册,则通知所有观察者会花费较高代价
  如果某些观察者的响应方法被阻塞,整个通知过程即被阻塞,其它观察者不能及时被通知

原文地址:https://www.cnblogs.com/liuligang/p/10576538.html