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

2019/06/01

什么是观察者模式?

观察者模式(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


一个有故事的程序员

(转载本站文章请注明作者和出处 纯洁的微笑-ityouknow

Show Disqus Comments

Post Directory