1. 定义一个统一的回调接口

public interface CallerInter {void call(Param param);
}

2. 定义观察者接口

public interface ObserverInter{/*** 增加观察者** @param callInter*/void addObserver(CallerInter callInter);/*** 删除观察者** @param lemmaWriteBackOpObserver*/void delObserver(CallerInter callInter);/*** 通知观察者** @param lemmaRecord*/void notifyAllObserver(Param param);
}

3. 定义观察者实现类

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;/*** Created by denglinjie on 2016/8/19.*/
@Service
public class ObserverImpl implements ObserverInter, InitializingBean {//要通知的对象列表private List<CallerInter> callerInterList;public void addObserver(CallerInter callInter) {callerInterList.add(callInter);}public void delObserver(CallerInter callInter) {callerInterList.remove(callInter);}public void notifyAllObserver(Param param) {for(CallerInter callerInter : callerInterList) {callerInter.call(param);}}public void afterPropertiesSet() throws Exception {callerInterList = new CopyOnWriteArrayList<CallerInter>();  //这里用一个线程安全的list,因为可能多线程同时操作它}/*** 对外提供一个接口,当这个接口被调用的时候,可以通知所有注册进来的对象的特定call接口*/public void operateService() {//构造参数Param param = new Param();notifyAllObserver(param);}
}

4. 定义两个要被观察的对象,需要把自己注册到观察者列表中,即上述ObserImpl的callInterList集合中

import com.sogou.study.observer.CallerInter;
import com.sogou.study.observer.ObserverInter;
import com.sogou.study.observer.Param;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;/*** Created by denglinjie on 2016/8/19.*/
public class CallImplFirst implements CallerInter, InitializingBean {@Autowiredprivate ObserverInter observerInter;public void call(Param param) {//do something}public void afterPropertiesSet() throws Exception {observerInter.addObserver(this);}
}
import com.sogou.study.observer.CallerInter;
import com.sogou.study.observer.ObserverInter;
import com.sogou.study.observer.Param;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;/*** Created by denglinjie on 2016/8/19.*/
public class CallImplSecond implements CallerInter, InitializingBean {@Autowiredprivate ObserverInter observerInter;public void call(Param param) {//do something}public void afterPropertiesSet() throws Exception {observerInter.addObserver(this);}
}

5. 这样其他业务调用ObserverImpl的operateService方法时,就可以通知所有的注册的对象做一些事情。当一个业务逻辑很复杂要做很多事情的时候,如果把代码写在一起会显得很拥挤,不利于维护,这时,可以通过这种观察者模式,将不同的业务处理区分开。

Java用观察者模式重构复杂的业务代码相关推荐

  1. 模板方法模式详解附有代码案例分析(包含模板方法模式重构JDBC操作业务代码示例)

    模板方法模式 一.模板方法模式的概念和角色 (一).模板方法模式的概念 (二).模板方法模式的角色 二.模板方法模式的应用场景 三. 模板方法模式的代码示例 四.模板方法模式重构JDBC操作业务 五. ...

  2. Java设计模式之观察者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  3. 定义一个dto对象_业务代码的救星——Java 对象转换框架 MapStruct 妙用

    在业务项目的开发中,我们经常需要将 Java 对象进行转换,比如从将外部微服务得到的对象转换为本域的业务对象 domainobject,将 domainobject 转为数据持久层的 dataobje ...

  4. 编写一个程序实现方法的覆盖java_编写Java程序代码必须先声明一个____,然后在其中编写实现需求的业务代码。...

    [多选题]下列关于多行注释的应用,正确的是( ) [单选题]是在思维中把对象分解为各个部分.侧面.属性以及阶段,分别加以考察的方法.(1.0分) [判断题]多行注释"/*...*/" ...

  5. 春节期间,我用责任链模式重构了业务代码

    前言 文章开篇,抛出一个老生常谈的问题,学习设计模式有什么作用? 设计模式主要是为了应对代码的复杂性,让其满足开闭原则,提高代码的扩展性 另外,学习的设计模式 一定要在业务代码中落实,只有理论没有真正 ...

  6. java业务代码自动降级实现

    java业务代码自动降级实现 业务需求 需要实现的功能 手动触发开关进行开启和关闭降级 降级开关没开启的时候,如果可降级的方法异常则自动降级 具体实现方式 自定义降级注解 切面和切点配置 配置降级后需 ...

  7. Java的日期与时间之如何计算业务代码的运行时间呢?

    转自: Java的日期与时间之如何计算业务代码的运行时间呢? 下文笔者讲述计算运行时间的方法分享,如下所示 实现思路:在业务开始时间和结束时间都加入获取时间的方法然后相减即可得到运行时间 例: lon ...

  8. 抽奖模块代码分享(数据库sql + java业务代码)

    抽奖模块代码分享(数据库sql + java业务代码) 最近进行的项目中,有个抽奖的需求,今天就把相关代码给大家分享一下. 一.DAO层 /*** 获取奖品列表* @param systemVersi ...

  9. Java使用Function包策略模式,优化业务代码大量if...else语句

    目录 场景模拟 Consumer与ToIntBiFunction简介,u> 场景Demo业务代码改造 最终结果 业务代码中,若存在大量无法避免的if...else代码,可以尝试使用JDK8提供的 ...

最新文章

  1. 移动端布局规范-固定页头页尾-中间随高度滑动
  2. 增强MyEclipse的代码自动提示功能(测试结果不是很爽)
  3. tar解压出错:gzip: stdin: unexpected end of file的解决
  4. 面象对象设计6大原则之六:迪米特原则
  5. coursera访问不了
  6. 基于Huffman树的CBOW模型的理解
  7. go tour - Go 入门实验教程
  8. 【交叉编译】配置交叉编译工具链
  9. 几张趣图助你理解HTTP状态码
  10. 计算机睡眠功能命令,使用WINDOWS命令行进入睡眠模式
  11. 【程序员如何买基金 九】基金定投的优势
  12. 计算机科学与技术培养计划,计算机科学与技术专业培养方案(2017版).PDF
  13. python 工资减税_Python告诉你个税抵扣能省多少钱?
  14. 石家庄康业软件科技有限公司
  15. 步步为营二 C语言基本概念 和 数据类型
  16. python数据挖掘与入门实践(2.2)用sciket-learn估计器分类
  17. office正在连接到服务器,excel2010总是显示正在访问打印机,导致打开很慢,怎样...-office正在访问打印机,word一直正在连接到打...
  18. java因子分析,SPSS统计分析全解析▶主成分分析与因子分析
  19. Key Points Estimation and Point Instance
  20. c语言数组秦朝末年楚汉相争,秦朝末年,楚汉相争,在鸿沟里有没有秦军的尸首呢?...

热门文章

  1. js面向对象插件的做法框架new goBuy('.cakeItem',{ add:'.add', reduce:'.reduce' },[1,0.7,0.6]);...
  2. Linux机器学习软件配置
  3. js实现鼠标放在一级菜单,下滑出二级菜单
  4. file结构体中private_data指针的疑惑
  5. silverlight 自定义资源整理(待后续补充)
  6. 使用组合改进软件测试用例的生成2
  7. 【hive】如何设置hive以及MapReduce的压缩方式?
  8. 接口测试怎么进行,如何做好接口测试
  9. 几款远程工具介绍(Xshell)(SecureCRT)(putty)
  10. 测试用例的八大设计方法