观察者模式学习笔记

概述

观察者模式是一种很常见的设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。该模式应用在各种和Listner相关的源码中,用于为组件提供一种灵活地向感兴趣的接收者广播消息的方式。例如Zookeeper中的Watcher机制,在Zserver中存放某个值,客户端会在Zookeeper的某个节点上注册Wather,当ZNode上的值被更新时,服务端就会通知客户端。观察者模式也可以称为发布订阅模式。

观察者模式结构图

观察者模式的结构图如下。Subject和Observeer都是接口,定义了具体实现类需要实现的方法。Subject可以理解为一个主题,它可以组合若干个Observer,因此需要声明Add和Remove方法,用于管理注册在该主题上的观察者,Notify方法用于通知该主题所持有的所有Observer,当主题的状态发生改变时即可调用。Observer就是字面意义上的观察者,每一个Observer都会对某个主题进行观察,当目标主题的状态被改变时,Observer的Update方法就会被调用,从而得到主题变更的相关信息。具体的主题和实现者实现相对应的接口即可。
观察者模式学习笔记_第1张图片

观察者模式实现

Subject 主题接口:
public interface Subject {
    void Add(Observer observer);
    void Remove(Observer observer);
    void Notify();
}
Observer 观察者接口:
public interface Observer {
    void Update();
}
ConcreteSubject 主题实现类:
public class ConcreteSubject implements Subject{
    List<Observer> list = new ArrayList<>();
    @Override
    public void Add(Observer observer) {
        list.add(observer);
    }

    @Override
    public void Remove(Observer observer) {
        list.remove(observer);
    }

    @Override
    public void Notify() {
        for (Observer observer: list) {
            observer.Update();
        }
    }
}
ConcreteObserver 观察者实现类:
public class ConcreteObserver implements Observer{
    @Override
    public void Update() {
        System.out.println(this.toString() + "Update");
    }
}
Client客户端调用:
public class Client {
    public static void main(String[] args) {
        Observer ob1 = new ConcreteObserver();
        Observer ob2 = new ConcreteObserver();
        Observer ob3 = new ConcreteObserver();
        Subject subject = new ConcreteSubject();
        subject.Add(ob1);
        subject.Add(ob2);
        subject.Add(ob3);
        subject.Notify();
        subject.Remove(ob2);
        subject.Notify();
    }
}

总结

总结来说,主题会维护一个观察者的列表,包含增加观察者、移除观察者和通知所有观察者三个方法;当主题状态改变时,主题会通过调用观察者的Update方法使得观察者感知到状态变化。以上代码是最简实现,可以根据需求进行更改。
在具体应用中,观察者类可能会以接口、抽象类等不同的形式存在,这取决于具体的业务需求,需要判断各个观察者之间是否具有共性。还有时候我们无法对内部封装的类进行更改,使得这些类能够实现观察者接口,此时需要用到动态代理加以实现。
观察者模式的主要工作就是在解耦,一个抽象模型有两个方面,其中一方面依赖于另一方面,这时使用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。让耦合的双方都依赖于抽象,而不依赖于具体,从而使得各自的变化都不会影响另一边的变化,这是依赖倒转原则的深度体现。

你可能感兴趣的:(设计模式)