观察者模式

观察者模式

一、定义

又叫发布-订阅模式;定义了对象之间的一对多依赖,当一个对象状态改变时,它的所有依赖者都会收到通知并自动更新。最为典型的例子:EventBus三方框架,主要用于Android的通信。

二、UML类图

观察者模式_第1张图片

从它的UML类图中可以看出,主要有四个角色:

  1. 发布者/被观察者(抽象):添加、移除、通知观察者的职责
  2. 订阅者/观察者(抽象):提供公共的更新方法
  3. 具体的被观察者
  4. 具体的观察者

三、观察者模式的简单实现

根据四个主要角色来进行划分:

1. 被观察者Observable

public interface Observable {
    /**
    * 添加观察者
    *
    * @param observer Observer
    */
    void register(Observer observer);

    /**
    * 移除观察者
    *
    * @param observer Observer
    */
    void unregister(Observer observer);

    /**
    * 通知所有观察者
    */
    void notifyAllObservers();
}

2. 观察者Observer

public interface Observer {

/**
 * 观察者通用更新方法
 *
 * @param newState 新状态值
 */
void update(String newState);

}

3. 具体的被观察者ConcreteObservable

    public final class ConcreteObservable implements Observable {

    private List mObservers = new ArrayList<>();
    private String state;

    public ConcreteObservable() {
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        notifyAllObservers();
    }

    @Override
    public void register(Observer observer) {
        if (mObservers == null) return;
        mObservers.add(observer);
    }

    @Override
    public void unregister(Observer observer) {
        if (mObservers == null) return;
        int index = mObservers.indexOf(observer);
        if (index == -1) return;
        mObservers.remove(observer);
    }

    @Override
    public void notifyAllObservers() {
        for (Observer observer : mObservers) {
            observer.update(this.state);
        }
    }
}

4. 具体观察者

public class ObserverA implements Observer {

    public ObserverA(Observable observable) {
        observable.add(this);
    }

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


    private void display(String newState) {
        System.out.println(" display:" + newState);
    }
}

在Main方法中如何调用?

Observable observable = new ConcreteObservable();
        Observer a = new ObserverA(observable);
        Observer b = new ObserverB(observable);

        ((ConcreteObservable) observable).setState("true");
        ((ConcreteObservable) observable).setState("false");

你可能感兴趣的:(java,设计模式,观察者模式)