观察者模式


  • 观察者模式:所有依赖于定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
  • 观察者模式的通用类图如下:

 

我们先来解释一下观察者模式中的几个角色名称:

    • Observer观察者:观察者接收到消息后,立即进行update()操作,对接收到的信息进行处理。
    • ConcreteObserver具体的观察者:观察者针对接收到的消息进行自己的逻辑处理。
    • Subject被观察者:定义被观察者必须实现的职责,它必须能够动态的增加、取消观察者。实现对观察者的管理和通知观察者。
    • ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义哪些事件进行通知。

观察者模式的通用代码如下:

复制代码
public abstract class Observer {
    public abstract void update();
}

public class Subject {
    private Vector<Observer> observers = new Vector<Observer>();
    public void addObserver(Observer o){
        observers.add(o);
    }
    public void delObserver(Observer o){
        if(observers.remove(o))
            System.out.println("the observer is removed");
    }
    public void notifyObservers(){
        for(Observer o : observers){
            o.update();
        }
    }
}

public class ConcreteObserver extends Observer{

    @Override
    public void update() {
        // TODO Auto-generated method stub
        System.out.println("接收消息并进行处理");
        /**
         * 自己的业务逻辑
         */
    }
}

public class ConCreteSubject extends Subject{
    public void doSomething(){
        /**
         * 自己的业务逻辑
         */
        super.notifyObservers();
    }
}
复制代码
观察者模式的优缺点
  • 观察者模式的优点
    • 观察者和被观察者之间是抽象耦合,如此设计不管是增加观察者和被观察者都非常容易扩展,而且在Java中已经实现了抽象层级的定义,在系统扩展方面更是得心应手。
    • 建立一套触发机制,形成一个触发链。
  • 观察者模式的缺点
    • 观察者模式需要考虑一下并发效率问题,一个被观察者,多个观察者,开发和调试会比较复杂,而且Java中消息的通知默认是顺序执行,一个观察者卡壳,会影响整体的执行效率。在一般情况下,需要考虑异步的方式。
观察者模式的扩展

复制代码
public class HanFeiZi extends Observable implements IHanFeiZi{

    @Override
    public void haveBreakfast() {
        // TODO Auto-generated method stub
        super.setChanged();
        super.notifyObservers("韩非子在吃饭");
    }

    @Override
    public void haveFun() {
        // TODO Auto-generated method stub
        super.setChanged();
        super.notifyObservers("韩非子在娱乐");
    }
    
}

public class Lisi implements Observer{

    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("观察者接收消息处理");
    }

}

public class Client {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Lisi lisi = new Lisi();
        HanFeiZi hanfeizi = new HanFeiZi();
        hanfeizi.addObserver(lisi);
        hanfeizi.haveBreakfast();
    }
}
复制代码
分类: 设计模式
posted on 2019-04-25 16:20  巨象  阅读(198)  评论(0编辑  收藏  举报