java观察者模式的三种实现方式代码实例
java观察者模式的三种实现方式
Java中可以使用观察者模式开发,有三种简单的方式可以实现。
自定义接口实现
观察者
public interface Observer { public void update(Object o); }
观察者的实现
public class ObserverImpl implements Observer{ private Object str; @Override public void update(Object o) { this.str = o; System.out.println(this.str); } }
观察者的注入和方法调用
@Autowired private List<Observer> observers; @GetMapping("impl/{str}") public void impl(@PathVariable("str") String str){ for (Observer observer : observers){ observer.update(str); } }
基于spring的事件
先定义spring事件
public class CustEvent extends ApplicationEvent { public String msg; public CustEvent(Object source, String msg) { super(source); this.msg = msg; } }
事件监听器
@Component public class CustEventListener { @EventListener() public void eventListen(ApplicationEvent applicationEvent){ if(applicationEvent instanceof CustEvent){ CustEvent custEvent = (CustEvent)applicationEvent; System.out.println(custEvent.msg); } } }
发布事件
@GetMapping("event/{str}") public void event(@PathVariable("str") String str){ context.publishEvent(new CustEvent(this,str)); }
基于Java原生接口
实现java.util.Observer
public class JavaObserverA implements Observer { private int myState; @Override public void update(Observable o, Object arg) { myState = ((JavaConcreteSubject)o).getState(); System.out.println(myState); } }
继承Observable类,注意发布时要调用父类的setChanged()和notifyObservers()方法
public class JavaConcreteSubject extends Observable { private int state; public void set(int s){ state = s; //目标对象的状态发生了改变 setChanged(); //表示目标对象已经做了更改 notifyObservers(state); //通知所有的观察者 } public int getState() { return state; } }
注册观察者,然后发布事件
private JavaConcreteSubject subject = new JavaConcreteSubject(); public testController(){ subject.addObserver(new JavaObserverA()); } @GetMapping("util/{str}") public void util(@PathVariable("str") String str){ subject.set(1); }
到此这篇关于java观察者模式的三种实现方式代码实例的文章就介绍到这了,更多相关java观察者模式实现方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题
这篇文章主要介绍了解决IDEA和CMD中java命令提示错误: 找不到或无法加载主类的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-09-09SpringBoot项目整合Log4j2实现自定义日志打印失效问题解决
这篇文章主要介绍了SpringBoot项目整合Log4j2实现自定义日志打印失效问题解决,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2024-01-01详解idea搭建springboot+mybatis框架的教程
这篇文章主要介绍了详解idea搭建springboot+mybatis框架的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-11-11解析Orika的MapperFacade 属性赋值的使用问题
在我们实际开发中,常常会有对象与对象之间的转化,或者把一个对象的数据转化到另一个数据之中,如果我们手动的一个一个的set就会比较麻烦,代码段看起来也会比较长。而Orika的MapperFacade就是解决这个问题的,实现对象属性的复制2021-12-12解决springboot项目上传文件出现临时文件目录为空的问题
这篇文章主要介绍了解决springboot项目上传文件出现临时文件目录为空的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-09-09java synchronized加载加锁-线程可重入详解及实例代码
这篇文章主要介绍了java synchronized加载加锁-线程可重入详解及实例代码的相关资料,需要的朋友可以参考下2017-02-02
最新评论