设计模式(七)-观察者模式

什么是观察者模式?

观察者模式(observer),定义了对象一对多的依赖关系。多个观察者对象监听同一个主题对象,当主题对象状态发生改变时,会通知所有观察者更新自己。

通俗的说,观察者模式就是一种发布-订阅模式。比如微信订阅号。

观察者模式由四部分组成:

  • 抽象主体对象(抽象的通知者),需要取得观察者的引用,包含添加观察者、删除观察者、通知观察者方法
  • 抽象观察者,有一个更新自己的方法
  • 具体观察者,实现抽象观察者接口
  • 具体通知者,实现抽象通知接口

观察者模式结构图
在这里插入图片描述

代码示例:
假设知乎关注了某一问题的场景。

一个抽象通知者接口Subject

/**
 *
 * 抽象通知者接口
 * @Author DevinLei
 *
 */
public interface Subject {

    /**
     * 添加通知用户
     **/
    void  addUser(Observer obj);

    /**
     * 移除通知用户
     **/
    void  deteUser(Observer obj);

    /**
     * 发送提醒消息
     **/
    void notifyUser();

}

抽象观察者接口 Observer

/**
 * 抽象观察者接口
 * @Author DevinLei
 */
public interface Observer {

  void update(String s);
}

具体的观察者SubUser,此场景指关注了某一问题的用户

/**
 * 知乎用户(具体观察者)
 * @Author DevinLei
 */
public class SubUser implements Observer{

    private String name;
    private String message;

    public SubUser(String name) {
        this.name = name;
    }

    @Override
    public void update(String mes) {
        this.message = mes;
        read();

    }

    public void read() {
        System.out.println(name + " 知乎收到一条推送消息: " + message);
    }

}

具体的通知者SubService,针对此场景就是知乎的订阅消息服务

/**
 * 知乎订阅消息服务(具体通知者)
 * @Author DevinLei
 */
public class SubService implements Subject {

    private List<Observer> list;

    private  String message;
    
    public SubService() {
        this.list = new ArrayList<>();
    }

    @Override
    public void addUser(Observer obj) {
        list.add(obj);
    }

    @Override
    public void deteUser(Observer obj) {
       if(!list.isEmpty()){
           list.remove(obj);
       }
    }

    /**
     * 遍历
     **/
    @Override
    public void notifyUser() {
        for(Observer observer :list){
             observer.update(message);
        }
    }

    public void setMessage(String mes){
       this.message = mes;
       // 通知观察者
        notifyUser();
    }
}

一个测试类:TestObserver

/**
 * @Author DevinLei
 */
public class TestObserver {
    
    public static void main(String[] args) {

        /**
         * 创建两个用户
         **/
        Observer xiaocai  = new SubUser("小菜");
        Observer daniao  = new SubUser("大鸟");

        /**
         * 将用户添加到通知者的list中
         **/
        SubService subject = new SubService();
        subject.addUser(xiaocai);
        subject.addUser(daniao);

        subject.setMessage("您关注的问题:观察者模式的原理?有新的回答了");

        System.out.println("-----------------");

        subject.deteUser(daniao);
        subject.setMessage("您关注的问题:观察者模式的原理?有新的回答了");

    }
}

输出结果:

小菜收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了
大鸟收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了
-----------------
小菜收到一条推送消息: 您关注的问题:观察者模式的原理?有新的回答了

观察者模式的应用
spring中的监听机制就使用了观察者模式,具体参考:
https://www.cnblogs.com/esther-qing/p/9019311.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值