观察者模式+AOP 代码示例
发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,背景当经纪人创建客户时,需要给对应的经纪人增加战报信息。在代码层面上,客源的相关类只针对客源数据表操作。而战报信息包含了多种业务统计数据,客源只是其中统计的部分数据。鉴于两者相对独立,且客源的战报信息
千家信息网最后更新 2024年11月25日观察者模式+AOP 代码示例
背景
当经纪人创建客户时,需要给对应的经纪人增加战报信息。在代码层面上,客源的相关类只针对客源数据表操作。而战报信息包含了多种业务统计数据,客源只是其中统计的部分数据。鉴于两者相对独立,且客源的战报信息会有所修改。因此,采用AOP+观察者模式构建代码。
代码
定义一个注解,用于AOP拦截。
/** * 战报注解 */@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.PARAMETER})@Documentedpublic @interface AchievementAnnotation { OperateEnum operate() default OperateEnum.ADD; enum OperateEnum{ ADD,UPDATE,DELETE }}
定义AOP,用户获取数据,并转发给观察者
/** * 战报AOP */@Aspect@Componentpublic class AchievementAop { /** * 战报观察者列表 */ private List observerList; public AchievementAop() { this.observerList = new ArrayList<>(); } public List getObserverList() { return observerList; } public void setObserverList(List observerList) { if (null != this.observerList) this.observerList.addAll(observerList); this.observerList = observerList; } /** *注入客源的观察者 */ @Autowired public void setCustomerAchievementObserver(CustomerAchievementObserver customerAchievementObserver) { getObserverList().add(customerAchievementObserver); } @Pointcut("@annotation(com.pretang.cloud.aop.AchievementAnnotation)") private void pointCut() { } @AfterReturning(pointcut = "pointCut()", returning = "retVal") public void after(JoinPoint joinPoint, Object retVal) { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method targetMethod = methodSignature.getMethod(); AchievementAnnotation annotation = targetMethod.getAnnotation(AchievementAnnotation.class); AchievementAnnotation.OperateEnum operateEnum = annotation.operate(); for (AchievementObserver observer : observerList) { if (observer.isSupport(retVal)) observer.execute(retVal); } }}
定义观察者通用接口
/** * 战报信息观察者接口 * @param */public interface AchievementObserver { /** * 是否支持该对象 * @param obj * @return */ boolean isSupport(Object obj); /** * 操作业务数据 * @param t * @throws RuntimeException */ void execute(T t) throws RuntimeException;}
客源观察者
/** * 客源信息的观察者 */@Componentpublic class CustomerAchievementObserver implements AchievementObserver { @Autowired private CustomerRpcService customerRpcService; @Override public boolean isSupport(Object obj) { return obj instanceof CustomerBase; } @Override public void execute(CustomerBase customerBase) throws RuntimeException { // 实际业务处理 customerRpcService.saveAchievement(customerBase.getAgentUserId(), "ADD_CUSTOMER", customerBase.getId()); }}
观察者
观察
客源
战报
数据
信息
代码
业务
接口
注解
经纪人
经纪
统计
模式
只是
多种
实际
客户
对象
层面
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
中国数据库安全图片
威力网络技术参考价格
云端服务器百科
vmware连接服务器账号密码
安庆市网络安全攻防比赛开赛
网络安全 审计工具
服务器批量管理2013
数据库系统基础教程 京东
拼多多网络服务器推荐
网络技术开发是做游戏吗
安庆华为云存储服务器找哪家
软件开发企业级
KIS服务器解绑
智能家居数据库
买会员为什么显示服务器错误
银川网络技术培训学校
为什么要学习网络安全执法概论
网络安全评估内容及步骤
唐山廊坊速达网络技术
创来网络技术有限公司真实吗
河北师大网络安全实验室
计算机网络技术以后的工作工资
软件开发专业毕业读研读什么
中国基因数据库在什么地方
动态表格服务器上不生效
计算机网络技术基础crc实例
未受信任的软件开发商
上海java软件开发代码
网络安全宣传学习网络安全法
mdb文件如何附加到数据库