记录开发中使用的设计模式之发布订阅者模式(观察者模式)

一、开发场景

当我们在开发中涉及到大量的调用跨应用API的时候,需要按照场景书写大量的重复性代码,常规的做法就是通过if/else进行场景判断,进行调用,代码十分的冗余,重复性的调用方法,不利于后期的维护,而为了更好的针对某些场景,去调用对应的API,可以使用发布订阅者模式更好的管理相关接口

二、订阅/发布者模式简介

观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF 给观察者模式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依 赖于它的对象都得到通知并被自动更新。

三、代码案例(UML图)

在这里插入图片描述

四、业务代码实现

注意:该设计模式是贴近业务场景的代码,不是原生的设计模式模板,已做了相关改动

  1. 事件发布者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);
    }
}

  1. 订阅者抽象类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);
    }
}

  1. 具体的订阅者,这里我们举两个操作的例子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("执行提交操作");

    }
}

  1. 事件注册类 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;
    }
}

  1. 执行工厂方法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();
    }
}

五、测试运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐 昊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值