美文网首页
设计模式之观察者模式

设计模式之观察者模式

作者: Mr_Qiang | 来源:发表于2021-11-10 11:23 被阅读0次

定义

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
  观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。

角色

  • 主题角色(Subject)

把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)里,在具体主题的内部状态改变时,给所有登记过的观察者发出通知

  • 抽象观察者(Observer)

为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。

  • 具体观察者(ConcreteObserver)

通过构成把具体的观察者加入到主题容器中,实现具体的更新方法,在得到通知后。

观察者模式结构图

ItEJDe.png

观察者模式利弊

例子

  • 主题角色,提供保存观察者对象的容器,提供了通知的方法
public class Subject {

    List<Observer> observers = new ArrayList();
    Integer state;

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyAllObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }

    public List<Observer> getObservers() {
        return observers;
    }

    public void setObservers(List<Observer> observers) {
        this.observers = observers;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }
}
  • 抽象观察者,持有主题的引用,提供了抽象的更新方法
public abstract class Observer {

    public Subject subject;

    public abstract void update();
}

  • 具体观察者一,BinaryObserver
public class BinaryObserver extends Observer {

    public BinaryObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this);
    }

    @Override
    public void update() {
        Integer subjectState = subject.getState();
        String binaryStr = Integer.toBinaryString(subjectState);
        System.out.println("Binary Observer update ,binary String: " + binaryStr);

    }
}
  • 具体观察者二,HexObserver
public class HexObserver extends Observer {

    public HexObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this);

    }

    @Override
    public void update() {
        Integer state = subject.getState();
        String hexStr = Integer.toHexString(state);
        System.out.println("HexObserver update,hex String: " + hexStr);
    }
}
  • 具体观察者三,OctObserver
public class OctObserver extends Observer {
    public OctObserver(Subject subject) {
        this.subject = subject;
        subject.attach(this);

    }

    @Override
    public void update() {
        Integer state = subject.getState();
        String octStr = Integer.toOctalString(state);
        System.out.println("OctObserver update ,oct String : " + octStr);
    }
}
  • 测试
public class BaseConversionDemo {


    public static void main(String[] args) {
        Subject subject = new Subject();

        new BinaryObserver(subject);
        new HexObserver(subject);
        new OctObserver(subject);
        System.out.println("############ String value :15 ############");
        subject.setState(15);
        subject.notifyAllObservers();
    }
}
-------------------------------------------------
############ String value :15 ############
Binary Observer update ,binary String: 1111
HexObserver update,hex String: f
OctObserver update ,oct String : 17

相关文章

网友评论

      本文标题:设计模式之观察者模式

      本文链接:https://www.haomeiwen.com/subject/exxvzltx.html