设计模式之观察者模式

158 阅读2分钟

1 简述

观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
举个生活中的例子,我们在某东上买东西,有可能那件商品现在处于无货状态,但是我们不可能时时刻刻都打开某东App去看现在有没有货,所以,一般都会点个到货通知,这样,有货的时候,App就会自动通知我们有货了。
从简单的逻辑上考虑,人是观察者,商品是被观察者,当商品状态发生变化时,我们得到通知,这就是观察者模式在生活中的体现。

2 代码示例

public class Main {
    public static void main(String[] args) {
        Goods goods = new Goods("白象方便面");
        goods.purchased();
    }
}

interface Observer  {
    void notifyUser(String goods);
}

class ZhangSan implements Observer {
    @Override
    public void notifyUser(String goods) {
        System.out.println("张三订阅的商品" + goods + "有货了");
    }
}

class LiSi implements Observer {
    @Override
    public void notifyUser(String goods) {
        System.out.println("李四订阅的商品" + goods + "有货了");
    }
}

class Goods {
    String name;
    public Goods(String name) {
        this.name = name;
    }

    private List<Observer> observers = new ArrayList<Observer>() {{
        add(new ZhangSan());
        add(new LiSi());
    }};

    public void purchased() {
        for (Observer o : observers) {
            o.notifyUser(name);
        }
    }
}

可以看到,我们通过维护观察者数组,去逐个通知他们,让张三李四在货到了时,可以立即观察到,商品状态的变化。
当然上述代码只是个示例,实际使用中,我们会经常用Listener的形式,或者,observers增加添加观察者删除观察者方法,增强可扩展性。

3 总结

观察者模式属于行为模式,针对实现触发环境,会非常有利于我们代码的解藕。
但是也有缺点,比如:

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

总的来说,我们需要根据具体场景,灵活得使用观察者模式。