zoukankan      html  css  js  c++  java
  • 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:收到消息内为:发布第二次消息...

  • 相关阅读:
    JavaScript 焦点事件
    在虚拟机里面运行java程序
    CentOS 7 命令
    修改和删除
    查询语句,查询指定的字段,带条件查询,排序查询
    Redis系列之-缓存的使用和优化
    Redis系列之-Redis-Sentinel
    Redis系列之主从复制原理与优化
    Redis系列之-使用常见问题
    Redis系列之-持久化
  • 原文地址:https://www.cnblogs.com/Andrew520/p/11116516.html
Copyright © 2011-2022 走看看