ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

系统代码重构

2022-08-05 14:34:23  阅读:185  来源: 互联网

标签:重构 code String 代码 系统 TYPEB class TYPE public


业务背景

以RabbitMQ接收消息,消费消息为例。
接收不同消息类型通知。做相应处理。

代码设计

设计模式:工厂模式+状态模式+策略模式
工厂:MessageReceiveProcessorTypeBServiceContext
状态:TYPEA-业务ATYPEB-业务BTYPEC-业务CTYPED-业务D
策略:TYPEB-业务B业务B-1TYPEB-业务B业务B-2
枚举:enum Action
泛型:T data
说明:将不同的消息类型的接收写在同一个工厂类MessageReceiveProcessor类中,根据不同的状态Action枚举值、且定义泛型T data接收不同消息类型的消息数据,跳转到不同的sevice中处理。
其中TYPEB-业务B消息处理TypeBServiceContext工厂,因TYPEB-业务B对于每一个TYPEB有不同的B-1/B-2处理。故对于同一个TYPEB-业务B状态,在工厂类TypeBServiceContext中根据”对应依据“策略到不同的service中去做不同的B-1/B-2处理。

微信交流群:Java技术沟通群⑤(点击加入)

枚举类ReceiveMessage

@Data
public class ReceiveMessage<T extends Serializable> {
    private String traceId;
    private String action;
    private T data;

    public static enum Action {
        TYPE_A("TYPEA", "业务A"),
        TYPE_B("TYPEB", "业务B"),
        TYPE_C("TYPEC", "业务C"),
        TYPE_D("TYPED", "业务D"),
        ;
        private String code;
        private String desc;

        private Action(String code, String desc) {
            this.code = code;
            this.desc = desc;
        }

        public static Action getAction(String code){
            if(code == null){
                return TYPE_B; //默认
            }
            for (Action action : values()) {
                if (action.code.equals(code)) {
                    return action;
                }
            }

            return TYPE_B;
        }
    }
}

消息接收工厂MessageReceiveProcessor

/**
 * MQ接收消息工厂
 */
@Slf4j
@Component("MessageReceiveProcessor")
public class MessageReceiveProcessor {
    @Resource
    IXXXService xxxService;

    @Resource
    TypeBServiceContext typeBServiceContext;

    public void receiveMessage(String message) {
        log.info("MQ接收业务数据入参, req: [{}]", message);
        ReceiveMessage requestDTO = JSON.parseObject(message, ReceiveMessage.class);
        try {
            switch (ReceiveMessage.Action.getAction(requestDTO.getAction())) {
                case TYPE_A:
                    xxxService.typeA(JSON.parseObject(requestDTO.getData().toString(), A.class));
                    break;
                case TYPE_B:
                     TypeBResponseDTO resp = typeBServiceContext.getTypeBService(StateEnum.B_1.getCode()).dealB(JSON.parseObject(requestDTO.getData().toString(), TypeBResponseDTO.class));
                    log.info("typeB, resp:[{}]", JSON.toJSONString(resp));
                    break;
                case TYPE_C:
                    xxxService.typeC(JSON.parseObject(requestDTO.getData().toString(), BRequestDTO.class));
                    break;
                case TYPE_D:      
                    xxxService.typeB(JSON.parseObject(requestDTO.getData().toString(), A.class));
                    break;

            }
        } catch (Exception e) {
            log.error("MQ接收消息初始化数据异常", e);
        } finally {
        //
        }

    }
}

状态-TYPEB-业务B-策略工厂NoticeMakeLoanStatusServiceContext

@Component
public class TypeBServiceContext {

    @Resource(name = "B-1Service")
    IBService b-1Service;
    @Resource(name = "B-2Service")
    IBService b-2Service;
    
    private Map<String,IBService> statusMap = new HashMap<>();
    @PostConstruct
    void init(){
        statusMap.put(StateEnum.B_1.getCode(),b-1Service);
        statusMap.put(StateEnum.B_2.getCode(),b-2Service);
      
    }
    public IBService getTypeBService(String code) throws Exception{
        IBService typeBService = statusMap.get(code);
        if(typeBService == null){
            throw new RainstormException("没有匹配的处理类");
        }
        return typeBService;
    }

}

状态-TYPEB-业务B-抽象类IBService

/**
 * TYPEB-业务B抽象处理类
 * 
 */
 @Slf4j
public abstract class IBService {

    /**
     * 业务B处理
     *
     */
    public TypeBResponseDTO dealB(RequestDTO requestDTO) {
        return null;
    }
    ...
}

标签:重构,code,String,代码,系统,TYPEB,class,TYPE,public
来源: https://www.cnblogs.com/henlan/p/16554162.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有