设计模式之观察者模式

基于Java观察者模式的定义

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

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

编码实现

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值