观察者模式+ AOP代码示例

  

背景

  

当经纪人创建客户时,需要给对应的经纪人增加战报信息。在代码层面上,客源的相关类只针对客源数据表操作。而战报信息包含了多种业务统计数据,客源只是其中统计的部分数据。鉴于两者相对独立,且客源的战报信息会有所修改,因此,采用AOP +观察者模式构建代码。

  

代码

  

<强>定义一个注解,用于AOP拦截。

  
 <代码>/* *
  *战报注解
  */@Retention (RetentionPolicy.RUNTIME)
  @Target({应用。方法,ElementType.PARAMETER})
  @Documented
  公共@ interface AchievementAnnotation {
  
  OperateEnum操作()默认OperateEnum.ADD;
  
  enum OperateEnum {
  添加、更新、删除
  }
  }
   之前
  

<强>定义AOP,用户获取数据,并转发给观察者

  
 <代码>/* *
  *战报AOP
  */@Aspect
  @ component
  公开课AchievementAop {/* *
  *战报观察者列表
  */私人ListobserverList;
  
  公共AchievementAop () {
  这一点。,observerList=new ArrayList<的在();
  }
  
  公共ListgetObserverList () {
  返回observerList;
  }
  
  公共空间setObserverList (ListobserverList) {
  如果(零!=this.observerList)
  this.observerList.addAll (observerList);
  这一点。observerList=observerList;
  }/* *
  *注入客源的观察者
  */@ autowired
  公共空间setCustomerAchievementObserver (CustomerAchievementObserver CustomerAchievementObserver) {
  getObserverList阀门()(customerAchievementObserver);
  }
  
  @Pointcut (“@annotation (com.pretang.cloud.aop.AchievementAnnotation)”)
  私人空间切入点(){
  }
  
  @AfterReturning(切入点="切入点()",返回=" retVal”)
  公共无效后(连接点的连接点,对象retVal) {
  签名签名=joinPoint.getSignature ();
  MethodSignature MethodSignature=(MethodSignature)签名;
  方法targetMethod=methodSignature.getMethod ();
  AchievementAnnotation注释=targetMethod.getAnnotation (AchievementAnnotation.class);
  AchievementAnnotation。OperateEnum OperateEnum=annotation.operate ();
  (AchievementObserver观察者:observerList) {
  如果(observer.isSupport (retVal))
  observer.execute (retVal);
  }
  }
  } 
  

<强>定义观察者通用接口

  
 <代码>/* *
  *战报信息观察者接口
  * @param & lt; T>
  */公共接口AchievementObserver{/* *
  *是否支持该对象
  * @param obj
  * @return
  */布尔isSupport(对象obj);/* *
  *操作业务数据
  * @param t
  * @throws RuntimeException
  */执行(T T)抛出RuntimeException的空白;
  }
   之前
  

客源观察者

  
 <代码>/* *
  *客源信息的观察者
  */@ component
  公共类CustomerAchievementObserver实现AchievementObserver{
  
  @ autowired
  私人CustomerRpcService CustomerRpcService;
  
  @Override
  公共布尔isSupport(对象obj) {
  返回obj instanceof CustomerBase;
  }
  
  @Override
  公共空间执行(CustomerBase CustomerBase)抛出RuntimeException {//实际业务处理
  customerRpcService.saveAchievement (customerBase.getAgentUserId ()、“ADD_CUSTOMER”customerBase.getId ());
  }
  } 

观察者模式+ AOP代码示例