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进行响应。
- DataHandler是一个订阅者接口,AbstractDataHandler是一个实现了这个接口的抽象类;
- 其他的类似于MetaDataHandler的类是一个具体的订阅者实现类,他们继承了抽象方法AbstractDataHandler;
- WebsocketDataHandler里面封装了封装了订阅和通知的方法,并且在里面将各个订阅者注册到了发布者上面;
- 消息通过
onMessage(...)
方法传递进来,然后在handleResult(...)
中执行通知消息websocketDataHandler.executor(groupEnum, json, eventType)
,对应的订阅者收到消息通知后做出响应的操作;
写在最后
猫大人这个webSocket运用发布订阅模式写的十分的巧妙,推荐大家去看一看 源码.。