用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
项目中的《访问者模式》
项目中的《访问者模式》
数据人与超自然意识
论坛元老
|
2024-12-17 21:10:15
|
显示全部楼层
|
阅读模式
楼主
主题
1820
|
帖子
1820
|
积分
5460
这个模式焦点头脑是将基本的数据对象和对应的操作相互分离。数据对象就只是数据对象,如果想要扩展操作,就扩展对应的visitor。
这种模式下的两次分派
第一次分派,是将对数据对象本身举行分派,可以有差别的实现。
第二次分派,是visitor接收差别的数据对象。
结果就是数据对象接受了visitor,然后visitor中组合了数据对象。
这个项目中的使用场景
对于订单状态,有两个数据载体,一个是数据库已存在的当前的状态,一个是消息推送过来的状态。通过两个载体的状态的组合,能做出响应的动作。
处置惩罚逻辑如下
⬇︎⬇︎⬇︎
UML是如许的⬇︎⬇︎⬇︎
现实代码是如许的⬇︎⬇︎⬇︎
DbStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.BusinessStatusEnum;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* @author Euler
*/
public abstract class DbStatus {
/**
* 处理结果
*/
private Integer businessStatus;
public DbStatus(Integer businessStatus) {
this.businessStatus = businessStatus;
}
private DbStatus() {
}
/**
* 接收天猫状态的visitor
* @param tmallVisitorStatus
* @return
*/
public abstract MessageDealWithResultEnum acceptTmallVisitor(TmallVisitorStatus tmallVisitorStatus);
/**
* 将DB记录的处理结果转成BusinessStatusEnum
* @return
*/
protected BusinessStatusEnum getBusinessStatus(){
return BusinessStatusEnum.valueOfCode(businessStatus);
}
}
复制代码
DbPayedStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* db记录已支付
* @author Euler
*/
public class DbPayedStatus extends DbStatus{
public DbPayedStatus(Integer businessStatus) {
super(businessStatus);
}
/**
* 接收天猫状态的visitor
*
* @param tmallVisitorStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum acceptTmallVisitor(TmallVisitorStatus tmallVisitorStatus) {
return tmallVisitorStatus.visitDbStatus(this);
}
}
复制代码
DbCloseStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* db记录已关闭
* @author Euler
*/
public class DbCloseStatus extends DbStatus{
public DbCloseStatus(Integer businessStatus) {
super(businessStatus);
}
/**
* 接收天猫状态的visitor
*
* @param tmallVisitorStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum acceptTmallVisitor(TmallVisitorStatus tmallVisitorStatus) {
return tmallVisitorStatus.visitDbStatus(this);
}
}
复制代码
DbChargeOffStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* db记录已核销
* @author Euler
*/
public class DbChargeOffStatus extends DbStatus{
public DbChargeOffStatus(Integer businessStatus) {
super(businessStatus);
}
/**
* 接收天猫状态的visitor
*
* @param tmallVisitorStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum acceptTmallVisitor(TmallVisitorStatus tmallVisitorStatus) {
return tmallVisitorStatus.visitDbStatus(this);
}
}
复制代码
TmallVisitorStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.BusinessStatusEnum;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* 天猫visitor
*
* @author Euler
*/
public interface TmallVisitorStatus {
/**
* 判断数据库记录是否处理成功
*
* @param statusEnum
*
* @return
*/
default boolean dbRecordIsFail(BusinessStatusEnum statusEnum) {
return BusinessStatusEnum.ABNORMAL.equals(statusEnum) || BusinessStatusEnum.CREATE_ORDER_ABNORMAL.equals(statusEnum);
}
/**
* 访问Db 已支付状态
*
* @param dbPayedStatus
*
* @return
*/
MessageDealWithResultEnum visitDbStatus(DbPayedStatus dbPayedStatus);
/**
* 访问Db已核销状态
*
* @param dbChargeOffStatus
*
* @return
*/
MessageDealWithResultEnum visitDbStatus(DbChargeOffStatus dbChargeOffStatus);
/**
* 访问Db 已退款状态
*
* @param dbCloseStatus
*
* @return
*/
MessageDealWithResultEnum visitDbStatus(DbCloseStatus dbCloseStatus);
}
复制代码
TmallVisitorPayedStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.BusinessStatusEnum;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* 天猫已支付状态
* @author Euler
* @date 2022 2022/11/22
*/
public class TmallVisitorPayedStatus implements TmallVisitorStatus {
/**
* 访问Db 已支付状态
*
* @param dbPayedStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbPayedStatus dbPayedStatus) {
BusinessStatusEnum businessStatus = dbPayedStatus.getBusinessStatus();
// 支付处理失败重试
if (dbRecordIsFail(businessStatus)) {
return MessageDealWithResultEnum.NORMAL;
// 支付处理成功,又来支付成功消息,视为重复消息,清除
}else{
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
}
/**
* 访问Db已核销状态
*
* @param dbChargeOffStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbChargeOffStatus dbChargeOffStatus) {
// 状态已经走到核销,又来已支付的消息。视为延时重复消息,清除
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
/**
* 访问Db 已退款状态
*
* @param dbCloseStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbCloseStatus dbCloseStatus) {
// 状态已走到关闭,又来已支付消息,视为延时消息,清除
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
}
复制代码
TmallVisitorCloseStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
*
* 天猫已退款状态
* @author Euler
*/
public class TmallVisitorCloseStatus implements TmallVisitorStatus{
/**
* 访问Db 已支付状态
*
* @param dbPayedStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbPayedStatus dbPayedStatus) {
boolean dbRecordIsFail = dbRecordIsFail(dbPayedStatus.getBusinessStatus());
// 已支付消息处理失败,订单没有创建成功,不能处理退款的消息
if (dbRecordIsFail) {
return MessageDealWithResultEnum.NO_SEQUENCE_MESSAGE;
// 已支付消息处理成功,可以正常处理退款消息
}else{
return MessageDealWithResultEnum.NORMAL;
}
}
/**
* 访问Db已核销状态
*
* @param dbChargeOffStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbChargeOffStatus dbChargeOffStatus) {
// 已核销和已退款是互斥消息,处理了核销,就不能处理退款。(天猫核销后不能在天猫退款)
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
/**
* 访问Db 已退款状态
*
* @param dbCloseStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbCloseStatus dbCloseStatus) {
boolean dbRecordIsFail = dbRecordIsFail(dbCloseStatus.getBusinessStatus());
// 退款消息处理失败,再来退款重试消息,正常处理
if (dbRecordIsFail) {
return MessageDealWithResultEnum.NORMAL;
// 退款消息处理成功了,再来退款消息,视为延时重复消息,清除
}else {
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
}
}
复制代码
TmallVisitorChargeOffVisitorStatus
package com.xxx.sales.saicorder.outerapp.tmall.message.visitor;
import com.xxx.sales.saicorder.outerapp.tmall.enums.MessageDealWithResultEnum;
/**
* 天猫核销完成状态
* @author Euler
*/
public class TmallVisitorChargeOffVisitorStatus implements TmallVisitorStatus {
/**
* 访问Db 已支付状态
*
* @param dbPayedStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbPayedStatus dbPayedStatus) {
boolean dbRecordIsFail = dbRecordIsFail(dbPayedStatus.getBusinessStatus());
// 已支付消息处理失败,订单没有创建成功,不能处理核销的消息。消息重回队列
if (dbRecordIsFail) {
return MessageDealWithResultEnum.NO_SEQUENCE_MESSAGE;
// 已支付处理成功,正常处理核销消息
}else{
return MessageDealWithResultEnum.NORMAL;
}
}
/**
* 访问Db已核销状态
*
* @param dbChargeOffStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbChargeOffStatus dbChargeOffStatus) {
boolean dbRecordIsFail = dbRecordIsFail(dbChargeOffStatus.getBusinessStatus());
// 核销处理失败,又来核销重试消息,正常处理
if (dbRecordIsFail) {
return MessageDealWithResultEnum.NORMAL;
// 核销处理成功,又来核销消息,视为重复消息,清除
}else{
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
}
/**
* 访问Db 已退款状态
*
* @param dbCloseStatus
*
* @return
*/
@Override
public MessageDealWithResultEnum visitDbStatus(DbCloseStatus dbCloseStatus) {
// 关闭后不在接收核销消息,清除
return MessageDealWithResultEnum.IS_REPEATED_MESSAGE;
}
}
复制代码
复杂的状态对应关系就如许解决了。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
数据人与超自然意识
论坛元老
这个人很懒什么都没写!
楼主热帖
4. 事务和锁
2023团队天梯模拟赛 L2-3 智能护理中心 ...
Java Long类的bitCount()方法具有什么 ...
kubernetes使用学习(k8s)
渗透测试02
【记录】Python爬虫|爬取空间PC版日志 ...
数据类型前置知识
那些年你用过最好的键盘
OSPF多区域
SQL Server 触发器
标签云
国产数据库
集成商
AI
运维
CIO
存储
服务器
浏览过的版块
数据仓库与分析
快速回复
返回顶部
返回列表