都在使用的《模版模式》

打印 上一主题 下一主题

主题 816|帖子 816|积分 2448

模版符合开闭原则,随处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中随处使用。

Channel中界说了需要的操作,AbstractChannel实现了核心功能,然后差别的Channel实现只需要告知具体channel的描述信息即可。
Channel 接口⬇︎⬇︎⬇︎
点击查看代码
  1. package com.xxx.sales.subscription.service.pubsub;
  2. import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
  3. import com.xxx.sales.subscription.service.pubsub.enums.ChannelEnum;
  4. /**
  5. * 通道/频道
  6. * <pre>
  7. *     消息发送到指定的channel中, 各个订阅者监听channel
  8. * </pre>
  9. *
  10. * @author huhaiyang
  11. */
  12. public interface Channel<K, V extends SubscribersResult> {
  13.     /**
  14.      * 获得信道描述
  15.      *
  16.      * @return {@link ChannelEnum}
  17.      */
  18.     ChannelEnum getChannelDescription();
  19.     /**
  20.      * 添加订阅者
  21.      *
  22.      * @param subscriber 订阅者
  23.      */
  24.     void addSubscriber(SafetySubscriber<K, V> subscriber);
  25.     /**
  26.      * 删除订阅者
  27.      *
  28.      * @param subscriber 订阅者
  29.      */
  30.     void removeSubscriber(SafetySubscriber<K, V> subscriber);
  31. }
复制代码
AbstractChannel 实现重要功能⬇︎⬇︎⬇︎
点击查看代码
  1. package com.xxx.sales.subscription.service.pubsub.chanels;
  2. import com.xxx.sales.subscription.service.pubsub.Channel;
  3. import com.xxx.sales.subscription.service.pubsub.SafetySubscriber;
  4. import com.xxx.sales.subscription.service.pubsub.dto.SubscriberResult;
  5. import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
  6. import lombok.extern.slf4j.Slf4j;
  7. import java.util.LinkedList;
  8. /**
  9. *
  10. * @author huhaiyang
  11. */
  12. @Slf4j
  13. public abstract class AbstractChannel<K, V extends SubscribersResult> implements Channel<K, V> {
  14.     private LinkedList<SafetySubscriber<K, V>> subscribers = new LinkedList<>();
  15.     /**
  16.      * 添加订阅者
  17.      *
  18.      * @param subscriber 订阅者
  19.      */
  20.     @Override
  21.     public void addSubscriber(SafetySubscriber subscriber) {
  22.         if (subscribers.contains(subscriber)) {
  23.             return;
  24.         }else {
  25.             subscribers.add(subscriber);
  26.         }
  27.     }
  28.     /**
  29.      * 删除订阅者
  30.      *
  31.      * @param subscriber 订阅者
  32.      */
  33.     @Override
  34.     public void removeSubscriber(SafetySubscriber subscriber) {
  35.         subscribers.remove(subscriber);
  36.     }
  37.     /**
  38.      * 接收消息
  39.      *
  40.      * @param message       消息
  41.      * @param collectResult 收集结果
  42.      */
  43.     public void  receiveMessage(K message,V collectResult){
  44.         log.info("receiveMessage start...");
  45.         for (SafetySubscriber<K, V> subscriber : subscribers) {
  46.             subscriber.update(message, collectResult);
  47.             SubscriberResult resultBySubscriber = collectResult.getResultBySubscriber(subscriber);
  48.             if (!resultBySubscriber.isSuccess()) {
  49.                 log.info("{}执行失败,开始失败策略...",subscriber.getClass().getSimpleName());
  50.                 subscriber.failBack(message,collectResult);
  51.                 log.info("{}失败策略执行结束.",subscriber.getClass().getSimpleName());
  52.             }
  53.         }
  54.         log.info("receiveMessage end...");
  55.     }
  56. }
复制代码
OrderActivateChannel 订单激活channel  ⬇︎⬇︎⬇︎
点击查看代码
  1. package com.xxx.sales.subscription.service.pubsub.chanels;
  2. import com.xxx.sales.subscription.service.pubsub.dto.OrderActivateMessage;
  3. import com.xxx.sales.subscription.service.pubsub.dto.SubscribersResult;
  4. import com.xxx.sales.subscription.service.pubsub.enums.ChannelEnum;
  5. import org.springframework.stereotype.Component;
  6. /**
  7. * 订单激活的channel
  8. *
  9. * @author huhaiyang
  10. * @date 2022 2022/12/8
  11. */
  12. @Component
  13. public class OrderActivateChannel extends AbstractChannel<OrderActivateMessage, SubscribersResult> {
  14.     /**
  15.      * 获得信道描述
  16.      *
  17.      * @return {@link ChannelEnum}
  18.      */
  19.     @Override
  20.     public ChannelEnum getChannelDescription() {
  21.         return ChannelEnum.ORDER_ACTIVATE;
  22.     }
  23. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张国伟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表