观察者模式

153 阅读2分钟

定义

观察者模式(Observer Pattern):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

观察者模式是一种对象行为型模式。

模式结构

  • Subject:目标 抽象的目标主要抽象的是观察这个的注册和注销,然后一个通知更新的方法
public interface Subject {

    /**
     * 注册观察者
     * @param observer
     */
    void registerObserver(Observer observer);

    /**
     *  取消观察者
     * @param observer
     */
    void removeObserver(Observer observer);

    /**
     * 通知更新
     */
    void notifyObservers();
}

  • ConcreteSubject: 具体目标
public class NotifyObserver implements Subject{

    private List<Observer> mObservers;

    public NotifyObserver() {
        mObservers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        mObservers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        int i = mObservers.indexOf(observer);
        if (i >= 0) {
            mObservers.remove(observer);
        }
    }

    @Override
    public void notifyObservers() {

        System.out.print(" >>>>>mObservers.size()>>>>>>>" + mObservers.size());
        System.out.println();
        for (Observer o: mObservers) {
            o.update("在吗????");
        }
    }
}
  • Observer: 观察者 抽象的观察者,所有观察者共同拥有的一个接口。
public interface Observer {

    /**
     * 处理逻辑
     * @param s
     */
    void update(String s);
}

  • ConcreteObserver: 具体观察者 观察者A
public class ObserverA implements Observer{

    Subject mSubject;

    public ObserverA(Subject subject) {
        mSubject = subject;
        mSubject.registerObserver(this);
    }

    @Override
    public void update(String s) {
        System.out.println("ObserverA:" + s);
    }
}

观察者B

public class ObserverB implements Observer{

    Subject mSubject;

    public ObserverB(Subject subject) {
        mSubject = subject;
        mSubject.registerObserver(this);
    }

    @Override
    public void update(String s) {
        System.out.println("ObserverB : " + s);
    }
}

测试代码

public class Test {

    public static void main(String[] args) {

        Subject subject = new NotifyObserver();

        Observer observerA = new ObserverA(subject);
        Observer observerB = new ObserverB(subject);

        // 通知更新
        subject.notifyObservers();

        //移除监听
        subject.removeObserver(observerA);

        System.out.println(">>>>>>>>>>>>>>>>>");

        subject.notifyObservers();
    }
}

测试结果

 >>>>>mObservers.size()>>>>>>>2
ObserverA:在吗????
ObserverB : 在吗????
>>>>>>>>>>>>>>>>>
 >>>>>mObservers.size()>>>>>>>1
ObserverB : 在吗????