设计模式之观察者模式

南笙酒味 提交于 2019-12-27 18:53:39

观察者模式的定义

定义了对象之间的一对多的依赖,这样一来,当一个对象改变时,它的所有的依赖者都会收到通知并自动更新。
好了,对于定义的理解总是需要实例来解析的,如今的微信服务号相当火啊,下面就以微信服务号为背景,给大家介绍观察者模式。

看一张图:
在这里插入图片描述

编码实现

首先开始写我们的主题接口,和观察者接口:

package observer;
//主题接口
public interface Subject {

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

    /**
     * 删除一个观察者
     * @param observer
     */
    public void removeObserver(Observer observer);

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

观察者接口:

package observer;

/**
 * 所有观察者都需要实现此接口
 */
public interface Observer {

    public void update(String msg);

}

然后我们以微信公众号发布订阅消息为例:

package observer;

import java.util.ArrayList;
import java.util.List;

public class WXPublic implements Subject{

    private List<Observer> observers = new ArrayList<Observer>();

    /**
     * 微信公众号的发布信息
     */
    private String msg;


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

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

    /**
     * 通知所有观察者
     */
    @Override
    public void notifyObserver() {
        observers.forEach(observer->{
            observer.update(msg);
        });
    }

    public void setMsg(String msg){
        this.msg = msg;
        notifyObserver();
    }

}

最后建俩个观察者,为了方便我写到了一个类里面:

package observer;

public class Observer1 implements Observer {

    private Subject subject;

    Observer1(Subject subject){
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String msg) {
        System.out.println(this.getClass().getName()+"得到可靠消息:"+msg);
    }

    public static void main(String[] args) {
        WXPublic wxPublic = new WXPublic();

        //关注者
        Observer1 observer1 = new Observer1(wxPublic);
        Observer2 observer2 = new Observer2(wxPublic);

        wxPublic.setMsg("first");
        wxPublic.setMsg("second");

    }
}

class Observer2 implements Observer {

    private Subject subject;

    Observer2(Subject subject){
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update(String msg) {
        System.out.println(this.getClass().getName()+"得到可靠消息:"+msg);
    }
}

最后输出结果:

observer.Observer1得到可靠消息:first
observer.Observer2得到可靠消息:first
observer.Observer1得到可靠消息:second
observer.Observer2得到可靠消息:second

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!