Soul源码解析(二)- 发布订阅模式


本篇我们将带大家学习一下发布订阅模式,并且提供一个发布订阅模式的示例,同时我们结合Soul源码来看一下Soul网关是如何运用发布订阅模式的。

发布订阅模式(观察者模式)

什么是发布订阅模式?

  • 在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖对象都会自动收到通知。

发布订阅模式解决了什么问题?

  • 一个对象状态发生变化的时候会通知多有订阅它的对象,其他对象收到通知以后完成自己的对应操作;
  • 发布者和订阅者是抽象耦合的;
  • 建立了一套触发机制;

示例代码

Subject 发布者

**
 * 发布者
 *
 * @author bigwillc
 **/
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

Observe 订阅者(观察者)

/**
 * 订阅者(观察者)
 *
 * @author bigwillc
 **/
public interface Observer {
    void update(String message);
}

ConcreteSubject

import java.util.ArrayList;
import java.util.List;

/**
 * @author bigwillc
 **/
public class ConcreteSubject implements Subject{
    private List<Observer> observers = new ArrayList<>();

    //绑定订阅
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    //删除订阅
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    //通知订阅者
    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

ConcreteObserverOne 订阅者1(观察者1)

/**
 * 订阅者1(观察者1)
 *
 * @author bigwillc
 **/
public class ConcreteObserverOne implements Observer{
    @Override
    public void update(String message) {
        // 收到订阅消息出发自己的业务操作
        System.out.println("Observer one receive message: " + message);
        System.out.println("Process your business...");
    }
}

ConcreteObserveTwo 订阅者2(观察者2)

/**
 * 订阅者2(观察者2)
 *
 * @author bigwillc
 **/
public class ConcreteObserverTwo implements Observer{
    @Override
    public void update(String message) {
        // 收到订阅消息后出发自己的业务操作
        System.out.println("Observer two receive message: " + message);
        System.out.println("Process your business...");
    }
}

Main()

/**
 * @author bigwillc
 **/
public class Application {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        subject.registerObserver(new ConcreteObserverOne());
        subject.registerObserver(new ConcreteObserverTwo());
        subject.notifyObservers("publish-subscribe!");
    }
}

Soul源码解析

下面通过一个WebSocket的示例演示一下Soul网关里面怎么使用发布订阅模式;

功能

下面演示的代码实现了一个这样的功能:

  • 用户在网关控制台修改网关配置以后,webSocket会接收到这条变动message, 同时触发对应的订阅者对这条message进行响应。
  1. DataHandler是一个订阅者接口,AbstractDataHandler是一个实现了这个接口的抽象类;
  2. 其他的类似于MetaDataHandler的类是一个具体的订阅者实现类,他们继承了抽象方法AbstractDataHandler;
  3. WebsocketDataHandler里面封装了封装了订阅和通知的方法,并且在里面将各个订阅者注册到了发布者上面;
    在这里插入图片描述
  4. 消息通过onMessage(...)方法传递进来,然后在handleResult(...)中执行通知消息websocketDataHandler.executor(groupEnum, json, eventType),对应的订阅者收到消息通知后做出响应的操作;
    在这里插入图片描述

写在最后

猫大人这个webSocket运用发布订阅模式写的十分的巧妙,推荐大家去看一看 源码.。

扫描二维码关注公众号,回复: 12422749 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_35115942/article/details/112797801