一、开发场景
当我们在开发中涉及到大量的调用跨应用API的时候,需要按照场景书写大量的重复性代码,常规的做法就是通过if/else进行场景判断,进行调用,代码十分的冗余,重复性的调用方法,不利于后期的维护,而为了更好的针对某些场景,去调用对应的API,可以使用发布订阅者模式更好的管理相关接口
二、订阅/发布者模式简介
观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF 给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并被自动更新。
三、代码案例(UML图)
四、业务代码实现
注意:该设计模式是贴近业务场景的代码,不是原生的设计模式模板,已做了相关改动
- 事件发布者Publisher
package com.CmJava.Desginer;
/**
* 事件的发布者
* 通知事件
*/
public class Publisher {
// 发布事件 类型
String event;
// 发布的消息
String msg;
private String getEvent() {
return event;
}
private void setEvent(String event) {
this.event = event;
}
private String getMsg() {
return msg;
}
private void setMsg(String msg) {
this.msg = msg;
}
/**
* 事件发布操作
* @param event
* @param msg
*/
public void publish(String event, String msg){
this.event = event;
this.msg = msg;
}
/**
* 通知订阅者
*/
public void NotifyPublisher(){
System.out.println("===消息发布===");
ActuatorFactory.sync(event,msg);
}
}
- 订阅者抽象类Subscriber
package com.CmJava.Desginer;
public abstract class Subscriber {
// 订阅事件
String event;
public Subscriber(String event) {
this.event = event;
}
// 处理方法
public void handle(String msg){
System.out.println("订阅消息:开始处理 。。。。"+msg);
}
}
- 具体的订阅者,这里我们举两个操作的例子SaveSubscriber
package com.CmJava.Desginer;
public class SaveSubscriber extends Subscriber {
public SaveSubscriber(String event) {
super(event);
}
@Override
public void handle(String msg) {
super.handle(msg);
System.out.println("SaveSubscriber 接收到:"+event);
System.out.println("执行保存操作");
}
}
SubmitSubscriber
package com.CmJava.Desginer;
public class SubmitSubscriber extends Subscriber {
public SubmitSubscriber(String event) {
super(event);
}
@Override
public void handle(String msg) {
super.handle(msg);
System.out.println("SubmitSubscriber 接收到:"+ event);
System.out.println("执行提交操作");
}
}
- 事件注册类 TopicRegister
该类用于区分,具体事件的订阅者
package com.CmJava.Desginer;
/**
* 事件注册类
*/
public class TopicRegister {
// 注册事件类型
String event;
// 注册订阅者
Subscriber subscriber;
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public Subscriber getSubscriber() {
return subscriber;
}
public void setSubscriber(Subscriber subscriber) {
this.subscriber = subscriber;
}
public TopicRegister(String event, Subscriber subscriber) {
this.event = event;
this.subscriber = subscriber;
}
}
- 执行工厂方法ActuatorFactory
用于处理,事件发布,去通知订阅者的工厂方法
package com.CmJava.Desginer;
import java.util.*;
public class ActuatorFactory {
private static final List<TopicRegister> list = new ArrayList<>();
static {
list.add(new TopicRegister("save",new SaveSubscriber("save")));
list.add(new TopicRegister("submit",new SubmitSubscriber("submit")));
}
/**
* 事件处理
* @param event
* @param msg
*/
public static void sync(String event,String msg){
for (TopicRegister register : list) {
if (register.getEvent().equals(event)){
Subscriber subscriber = register.getSubscriber();
subscriber.handle(msg);
}
}
}
}
package com.CmJava.Desginer;
public class MainTest {
public static void main(String[] args) {
Publisher publisher = new Publisher();
System.out.println("===第一次消息发布===");
publisher.publish("save", "需要保存数据,,,");
publisher.NotifyPublisher();
System.out.println();
System.out.println("===第二次消息发布===");
publisher.publish("submit", "需要提交数据,,,");
publisher.NotifyPublisher();
}
}
五、测试运行结果