设计模式之观察者模式

2021-11-10  本文已影响0人  Mr_Qiang

定义

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

角色

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

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

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

观察者模式结构图

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();
}

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);

    }
}
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);
    }
}
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
上一篇 下一篇

猜你喜欢

热点阅读