张国伟 发表于 2024-12-17 18:59:23

都在使用的《模版模式》

模版符合开闭原则,随处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中随处使用。
https://img2024.cnblogs.com/blog/3019051/202412/3019051-20241217182850775-107084133.png
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 voidreceiveMessage(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;
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 都在使用的《模版模式》