首页 > 其他分享 >都在使用的《模版模式》

都在使用的《模版模式》

时间:2024-12-17 18:41:54浏览次数:5  
标签:service 模版 xxx 模式 subscriber 使用 import com pubsub

模版符合开闭原则,到处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中到处使用。
image
Channel中定义了需要的操作,AbstractChannel实现了核心功能,然后不同的Channel实现只需要告知具体channel的描述信息即可。

Channel 接口⬇︎⬇︎⬇︎

点击查看代码
package com.xxx.sales.subscription.service.pubsub;

import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
import com.xxx.sales.subscription.service.pubsub.enums.ChannelEnum;

/**
 * 通道/频道
 * <pre>
 *     消息发送到指定的channel中, 各个订阅者监听channel
 * </pre>
 *
 * @author huhaiyang
 */
public interface Channel<K, V extends SubscribersResult> {


    /**
     * 获得信道描述
     *
     * @return {@link ChannelEnum}
     */
    ChannelEnum getChannelDescription();


    /**
     * 添加订阅者
     *
     * @param subscriber 订阅者
     */
    void addSubscriber(SafetySubscriber<K, V> subscriber);


    /**
     * 删除订阅者
     *
     * @param subscriber 订阅者
     */
    void removeSubscriber(SafetySubscriber<K, V> subscriber);


}

AbstractChannel 实现重要功能⬇︎⬇︎⬇︎

点击查看代码
package com.xxx.sales.subscription.service.pubsub.chanels;

import com.xxx.sales.subscription.service.pubsub.Channel;
import com.xxx.sales.subscription.service.pubsub.SafetySubscriber;
import com.xxx.sales.subscription.service.pubsub.dto.SubscriberResult;
import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
import lombok.extern.slf4j.Slf4j;

import java.util.LinkedList;

/**
 *
 * @author huhaiyang
 */
@Slf4j
public abstract class AbstractChannel<K, V extends SubscribersResult> implements Channel<K, V> {

    private LinkedList<SafetySubscriber<K, V>> subscribers = new LinkedList<>();


    /**
     * 添加订阅者
     *
     * @param subscriber 订阅者
     */
    @Override
    public void addSubscriber(SafetySubscriber subscriber) {
        if (subscribers.contains(subscriber)) {
            return;
        }else {
            subscribers.add(subscriber);
        }

    }

    /**
     * 删除订阅者
     *
     * @param subscriber 订阅者
     */
    @Override
    public void removeSubscriber(SafetySubscriber subscriber) {
        subscribers.remove(subscriber);
    }


    /**
     * 接收消息
     *
     * @param message       消息
     * @param collectResult 收集结果
     */
    public void  receiveMessage(K message,V collectResult){
        log.info("receiveMessage start...");
        for (SafetySubscriber<K, V> subscriber : subscribers) {
            subscriber.update(message, collectResult);
            SubscriberResult resultBySubscriber = collectResult.getResultBySubscriber(subscriber);
            if (!resultBySubscriber.isSuccess()) {
                log.info("{}执行失败,开始失败策略...",subscriber.getClass().getSimpleName());
                subscriber.failBack(message,collectResult);
                log.info("{}失败策略执行结束.",subscriber.getClass().getSimpleName());
            }
        }
        log.info("receiveMessage end...");
    }
}

OrderActivateChannel 订单激活channel ⬇︎⬇︎⬇︎

点击查看代码
package com.xxx.sales.subscription.service.pubsub.chanels;

import com.xxx.sales.subscription.service.pubsub.dto.OrderActivateMessage;
import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
import com.xxx.sales.subscription.service.pubsub.enums.ChannelEnum;
import org.springframework.stereotype.Component;

/**
 * 订单激活的channel
 *
 * @author huhaiyang
 * @date 2022 2022/12/8
 */
@Component
public class OrderActivateChannel extends AbstractChannel<OrderActivateMessage, SubscribersResult> {
    /**
     * 获得信道描述
     *
     * @return {@link ChannelEnum}
     */
    @Override
    public ChannelEnum getChannelDescription() {
        return ChannelEnum.ORDER_ACTIVATE;
    }
}


标签:service,模版,xxx,模式,subscriber,使用,import,com,pubsub
From: https://www.cnblogs.com/euler-blog/p/18613233

相关文章

  • ABAP 7.4 新语法:使用 FOR LOOP 语法循环内表到新内表
    单个表使用FOR迭代FOR语句也称为迭代表达式。你可以使用以下代码:*&---------------------------------------------------------------------**&ReportZDEMO_FOR_LOOP*&---------------------------------------------------------------------**&*&-----------......
  • 【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节
    现象在yasql执行sql语句后报错:YASQL-00021inputlineoverflow(>4000byteatline4)原因yasql在交互模式模式下单行字符总量限制4000字节,超出该限制即报错。交互式模式下,yasql会显示一个提示符,通常是SQL>,等待用户输入命令,用户执行的每个命令都会立即执行,并显示结果。......
  • Redis的使用--排行榜实现
    在项目中,我们常对于能在某段时间内持续使用的数据添加到缓存中,以便于能更快的做出响应和减少对数据库的操作,例如一些图片数据,并衍生出如后端防抖,限时的短信验证码校验,这里我们主要是对排行榜功能的实现在地球生做Java后端的你,如果遇到一个需求是实现排行榜功能:一定会在第一时......
  • DataX - [03] 使用案例
    题记部分 001||mysql2hdfs(1)查看MySQL被迁移的数据情况(2)根据需求确定reader为mysqlreader,writer为hdfswriter查看reader和writer模板的方式(-r读模板;-w写模板)pythonbin/datax.py-rmysqlreader-whdfswriter(3)编写同步json脚本(4)确定HDFS上目标路径是否存在(5)通过da......
  • Rollup使用
    官方文档简介|rollup.js中文文档|rollup.js中文网rollup.config.mjs里面的相关插件,在Npm里面进行相关搜索即可,这里我列举出一些常用的插件import{babel}from'@rollup/plugin-babel';//处理兼容性importclearfrom'rollup-plugin-clear'//打包前清空目录im......
  • 使用verilog生成各种CRC校验码
    一、功能介绍在FPGA进行各种接口通信时,经常会出现对方发来的数据带有CRC校验码,如CRC5、CRC8、CRC16、CRC32等,为了适应不同的情况,我们使用Verilog实现了一个比较通用的CRC计算模块,可生成CRC5/CRC8/CRC16/CRC32等各种宽度的CRC校验码,满足不同场景下的CRC校验需求。二、模块调用示......
  • 了解 CSS3 中弹性盒子布局 flex-flow 属性的使用
    功能描述前提:使用display:flex将模块设置为弹性盒子布局模式flex-flow是flex-direction与flex-wrap两个属性的简写形式。这个属性用于在弹性容器(flex)中设置项目的排列方式,如果容器不是弹性布局,则属性无效。flex-direction属性决定了项目的主轴方向,而flex-wrap属性......
  • 【YashanDB知识库】用yasldr配置Bulkload模式作单线程迁移300G的业务数据到分布式数据
    问题描述详细版本:YashanDBServerEnterpriseEditionRelease23.2.4.100x86_646db1237影响范围:离线数据迁移场景,影响业务数据入库。外场将部分NewCIS的报表业务放到分布式数据库,验证SQL性能水平。操作系统环境配置:125G内存32CCPU2T的HDD磁盘问题出现的步骤/操作:1、......
  • 大家都一样的《策略模式》
    不同类型的消息处理这里抽象层用的是接口MessageProcess⬇︎⬇︎⬇︎点击查看代码/***消息处理**@authorhaiyang*/publicinterfaceMessageProcess<K,V>{/***处理消息**@parammessageInfo消息相关信息*@return{@linkV}......
  • Clion使用GLFW
    GLFW点击跳转  在GLFW下载页中,有两个下载项64-bit文件:当你准备制作64位的程序时,下载这个选项。需注意:只有64位操作系统才能运行32-bit文件:当你准备制作32位的程序时,下载这个选项。该选项可运行在32、64、x86系统下本教程为32-bit文件包 Clion配置glfw文件在cl......