package com.taoke.subscribePublish;
/**
* 消息实体类
*
* @author taoke
* @date 2023/4/20
*/
public class Message<M> {
/**
* 发布者
*/
private String publisher;
/**
* 消息
*/
private M m;
public Message(String publisher, M m) {
this.publisher = publisher;
this.m = m;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public M getM() {
return m;
}
public void setM(M m) {
this.m = m;
}
}
4、发布订阅调度中心
package com.taoke.subscribePublish;
import java.util.ArrayList;
import java.util.List;
/**
* 发布订阅调度中心
*
* @author taoke
* @date 2023/4/20
*/
public class Dispatcher<M> {
/**
* 订阅者集合
*/
private final List<ISubscriber<M>> subscribers = new ArrayList<>();
public Dispatcher() {
}
/**
* 发布者发布消息
*
* @param publisher 发布者
* @param message 消息
*/
public void publish(String publisher, M message) {
for (ISubscriber<M> subscriber : subscribers) {
subscriber.receiveMessage(publisher, message);
}
}
/**
* 订阅
*
* @param subscriber 订阅者
*/
public void subscribe(ISubscriber<M> subscriber) {
subscribers.add(subscriber);
}
/**
* 退订
*
* @param subscriber 订阅者
*/
public void unSubscribe(ISubscriber<M> subscriber) {
subscribers.remove(subscriber);
}
}
5、测试类
package com.taoke.subscribePublish;
/**
* 发布订阅模式测试类
*
* @author taoke
* @date 2023/4/20
*/
public class Test {
public static void main(String[] args) {
//创建发布订阅调度中心
Dispatcher<String> dispatcher = new Dispatcher<>();
//创建发布者和订阅者
IPublisher<String> publisher = new ChildPublisher<>("发布者");
ISubscriber<String> subscriber1 = new ChildSubscriber<>("订阅者1");
ISubscriber<String> subscriber2 = new ChildSubscriber<>("订阅者2");
//订阅者1和订阅者2订阅发布者
subscriber1.subscribe(dispatcher);
subscriber2.subscribe(dispatcher);
//发布者发布消息,订阅者1和订阅者2分别收到消息
publisher.publish(dispatcher, "hello");
publisher.publish(dispatcher, "world");
}
}