设计模式之观察者模式

Posted JKerving

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式相关的知识,希望对你有一定的参考价值。

观察者模式无外乎两个操作,observer订阅自己关心的主题、主题有变化后通知订阅此主题的observers。
首先创建主题,主题中需要持有观察者列表的引用,用于在有状态或数据变化后通知到所有订阅此主题的观察者们。

public class Subject 
    private List<Observer> observers = new ArrayList<Observer>();
    private int state;
    public int getState()
        return state;
    

    public void setState(int state)
        this.state=state;
        
        notifyAllObservers();
    

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

    private void notifyAllObservers() 
        for(Observer observer:observers)
            observer.update();
        
    

定义观察者接口

public abstract class Observer 
    protected Subject subject;
    public abstract void update();

接下来定义几个不同的观察者类

public class BinaryObserver extends Observer

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

    @Override
    public void update() 
        String result = Integer.toBinaryString(subject.getState());
        System.out.println("订阅的数据发生变化,新的数据处理为二进制值为:"+result);
    

public class HexaObserver extends Observer

    public HexaObserver(Subject subject)
        this.subject=subject;
        this.subject.attach(this);
    

    @Override
    public void update() 
        String result = Integer.toHexString(subject.getState()).toUpperCase();
        System.out.println("订阅的数据发生变化,新的数据处理为十六进制值为:"+result);
    


client端调用

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

        new BinaryObserver(subject);
        new HexaObserver(subject);

        subject.setState(12);
    

输出为

大家只要记住最核心的部分,一定有一个地方存放了所有的观察者,然后在事件发生的时候,遍历观察者,调用它们的回调函数。

以上是关于设计模式之观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

设计思想与模式之五观察者模式

PHP设计模式之----观察者模式

Head First设计模式之观察者模式

设计模式之观察者模式

设计模式系列之四:观察者模式

深入 Laravel 内核之观察者模式