• java 发布订阅


    https://www.cnblogs.com/coderdxj/p/9627310.html

    java 观察这模式(发布订阅模式)

     

    观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。

    发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。

    • 抽象被观察者角色:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。
    • 抽象观察者角色:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
    • 具体被观察者角色:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。
    • 具体观察者角色:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。

    java实现:

    抽象被观察者(抽象主题):Observable.java

    抽象被观察者的具体实现(主题服务):ObservableImpl.java

    抽象观察者(用户(订阅者)的抽象):Observer.java

    抽象观察者的具体实现(用户(订阅者)具体实现):User.java

    Observable.java(被订阅服务的实现)

    /**
    * @ClassName Observerable 被观察者(被订阅的对象抽象)
    * @Description TODO
    * @author jxd
    * @Date 2018年9月11日 上午10:15:33
    * @version 1.0.0
    */
    public interface Observable {
    //注册用户
    public void registerUser(Observer observer);
    //移除用户
    public void removeUser(Observer observer);
    //通知观察者
    public void notifyObserver();

    }

    ObservableImpl.java(被订阅服务的实现)

    /**
    * @ClassName ObservableImpl 抽象被观察者(主题服务)的具体实现
    * @Description TODO
    * @author jxd
    * @Date 2018年9月11日 下午1:58:42
    * @version 1.0.0
    */
    public class ObservableImpl implements Observable {

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

    private String message;

    @Override
    public void registerUser(Observer observer) {
    // TODO Auto-generated method stub
    userList.add(observer);
    }

    @Override
    public void removeUser(Observer observer) {
    // TODO Auto-generated method stub
    if (observer != null && userList != null && userList.size() > 0) {
    userList.remove(observer);
    }
    }

    @Override
    public void notifyObserver() {
    // TODO Auto-generated method stub
    userList.forEach(x -> {
    x.getTopicNotification(message);
    });
    }

    public void setInformation(String str){
    this.message=str;
    notifyObserver();
    }

    }

    Observer.java(订阅者的抽象)

    /**
    * @ClassName Observer 抽象观察者(需要订阅主题的用户)
    * @Description TODO
    * @author jxd
    * @Date 2018年9月11日 上午10:16:49
    * @version 1.0.0
    */
    public interface Observer {

    /**
    * @Description (得到主题(订阅对象)返回的通知)
    * @param message
    */
    public void getTopicNotification(String message);
    }

    User.java(订阅对象的实现)

    public class User implements Observer {

    private String name;
    private String message;

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

    @Override
    public void getTopicNotification(String message) {
    // TODO Auto-generated method stub
    this.message = message;
    read();

    }

    public void read() {
    System.out.println(name + ":" + "收到消息内为:" + message);
    }

    }

    测试。。。。。。。。。。

    public static void main(String[] args) {
    Observer z=new User("jinxudong");
    Observer s = new User("jinxudong1");
    Observer e = new User("jinxudong2");
    ObservableImpl wechatServer=new ObservableImpl();
    wechatServer.registerUser(s);
    wechatServer.registerUser(z);
    wechatServer.registerUser(e);
    wechatServer.setInformation("发布第一次消息...");
    System.out.println("-------------------测试取消关注 -------");
    wechatServer.removeUser(z);
    wechatServer.setInformation("发布第二次消息...");


    }

    测试结果:

    jinxudong1:收到消息内为:发布第一次消息...
    jinxudong:收到消息内为:发布第一次消息...
    jinxudong2:收到消息内为:发布第一次消息...
    -------------------测试取消关注 -------
    jinxudong1:收到消息内为:发布第二次消息...
    jinxudong2:收到消息内为:发布第二次消息...

  • 相关阅读:
    Constants and Variables
    随想
    C#基础篇之语言和框架介绍
    Python基础19 实例方法 类方法 静态方法 私有变量 私有方法 属性
    Python基础18 实例变量 类变量 构造方法
    Python基础17 嵌套函数 函数类型和Lambda表达式 三大基础函数 filter() map() reduce()
    Python基础16 函数返回值 作用区域 生成器
    Python基础11 List插入,删除,替换和其他常用方法 insert() remove() pop() reverse() copy() clear() index() count()
    Python基础15 函数的定义 使用关键字参数调用 参数默认值 可变参数
    Python基础14 字典的创建修改访问和遍历 popitem() keys() values() items()
  • 原文地址:https://www.cnblogs.com/Andrew520/p/11116516.html
Copyright © 2020-2023  润新知