博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用util包里自带的接口和类实现观察者模式
阅读量:5251 次
发布时间:2019-06-14

本文共 1901 字,大约阅读时间需要 6 分钟。

 

之前的关于观察者模式的文章,是用自己写的Observable接口和Observer接口,然后进行实现。其实官方的util包下自带有实现观察者模式对应的接口和类,可以简化我们的代码结构。

 

比如我们可以直接创建一个子类通过继承 util包下的Observable类来成为被观察者,这样就不用自己去写一个接口,然后实现它的方法,或是自己创建一个List来存储所有观察者了。

我们只需要在需要通知观察者时先调用setChanged()来表示自己的数据或状态已经发生了改变,然后在调用notifyObservers()方就可以了。

依旧拿上次的猫叫惊醒主人,吓跑老鼠的场景为例:

 

先写Cat类

public class Cat extends Observable{        public String message;        public void miao(){
this.message="喵~~"; System.out.println("喵~~"); setChanged(); notifyObservers(this.message); }

可见,这次的代码比之前简洁了许多,我们这里要注意的是 ,在调用notifyObservers()方法之前一定要先调用setChanged()方法,用于表示被观察者的状态已经发生了改变,不然观察者们不会进行响应。另外,我们可以注意到,notifyObservers()传入的是this.message,也就是把 "喵~~" 发送给观察者。

 

再看另一边的观察者们

老鼠类

public class Mouse implements java.util.Observer{    public void run(String message){        System.out.println("我听到了"+message+" 快跑啊!猫来啦!!");        }    @Override    public void update(java.util.Observable o, Object arg) {        run(arg.toString());    }}

老鼠类的update()方法中有两个参数,第一个就是被观察者对象,也就是猫,第二个就是猫的notifyObservers()方法里传入的参数,也就是“喵~~”,如果之前在猫的notifyObservers()方法中什么都不传,那么这里得到的arg就是null。我们在update()方法中直接执行了run()方法,表示老鼠开始逃跑。

来看最后一个 主人类

public class Master implements java.util.Observer{        public void awake(String message){        System.out.println(message.toString()+"  别打扰我睡觉!!");    }    @Override    public void update(Observable o, Object arg) {        awake(arg.toString());    }}

和老鼠类的实现相同,在update()中调用awake()方法表示被吵醒。

 

场景类

public class Context {    public static void main(String[] args) {        Cat tom=new Cat();        Master master=new Master();        Mouse jerry=new Mouse();                tom.addObserver(master);        tom.addObserver(jerry);        tom.miao();    }}

场景类基本没有变化

最终的执行结果如下:

喵~~我听到了喵~~ 快跑啊!猫来啦!!喵~~  别打扰我睡觉!!

 

总的来说,使用官方的类和接口后,我们的代码相较之前简洁了许多,如果对观察者模式不够熟悉的,可以先自己去写Observable和Observer接口来实现。而如果已熟练掌握了大概的思想,还是推荐使用官方提供给我们的util。

 

转载于:https://www.cnblogs.com/weimore/p/7242571.html

你可能感兴趣的文章
简述spring中常有的几种advice?
查看>>
学习Redux之分析Redux核心代码分析
查看>>
ABAP 创建和调用WebService
查看>>
C# 实例化顺序
查看>>
CSS水平垂直居中总结
查看>>
委托又给我惹麻烦了————记委托链的取消注册、获取返回值
查看>>
ps怎么把白色背景变透明
查看>>
gource 安装教程
查看>>
字符串转 Boolean 的正确方式
查看>>
给你的网站404页面加上“宝贝寻亲”公益页面
查看>>
整理推荐的CSS属性书写顺序
查看>>
协程, IO阻塞模型 和 IO非阻塞模型
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>
Crontab 在linux中的非常有用的Schedule Jobs
查看>>
ProxySQL Scheduler
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>