使用util包里自带的接口和类实现观察者模式

之前的关于观察者模式的文章,是用自己写的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。

时间: 2024-08-28 21:07:28

使用util包里自带的接口和类实现观察者模式的相关文章

java util包概述

util是utiliy的缩写,意为多用途的,工具性质的包这个包中主要存放了:集合类(如ArrayList,HashMap等),随机数产生类,属性文件读取类,定时器类等类.这些类极大方便了Java编程,日常java编程中,经常要用到这些类. 介绍 Java的实用工具类库java.util包.在这个包中,Java提供了一些实用的方法和数据结构.例如,Java提供日期(Data)类.日历 (Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(St

利用ASP.NET里自带的站点地图工具制作网站站点地图

站点地图很方便能快速给我们导航我们要去访问的地址,能按层级关系分门别类,给用户一个很好的用户体验,很好的看到自己当前所在的网站位置 站点地图,又称网站地图,它就是一个页面,上面放置了网站上所有页面的链接.大多数人在网站上找不到自己所需要的信息时,可能会将网站地图作为一种补救措施.搜索引擎蜘蛛非常喜欢网站地图. 网站地图是一个网站所有链接的容器.很多网站的连接层次比较深,蜘蛛很难抓取到,网站地图可以方便搜索引擎蜘蛛抓取网站页面,通过抓取网站页面,清晰了解网站的架构,网站地图一般存放在根目录下并命名

Servlet基础之一:Servlet基本接口与类

1.概述 Servlet API中共有5个包,约113个接口和类: javax.servlet javax.servlet.http javax.servlet.jsp javax.servlet.annotation javax.servlet.descriptor 2.Servlet接口 (1)所有Servlet/JSP应用必须直接或者间接实现Servlet接口, Servlet/JSP容器会将实现了Servlet接口的类加载至容器,以供访问. (2)Servlet中共定义了5个方法: vo

源码分析八(org.springframework.util包之StringUtils类))

一:spring框架util包中的StringUtils类主要是处理关于字符串 的功能方法,下面直接结合代码分析: //判断字符串是否为空,如果为nul或者""则返回true,否则返回false public static boolean isEmpty(Object str) { return str == null || "".equals(str); } //判断字符串是否有长度,不等于null同时长度大于0,则为true //这里重载两个hasLength方

sparklyr包--实现R与Spark接口

1.sparklyr包简介 Rstudio公司发布的sparklyr包具有以下几个功能: 实现R与Spark的连接: sparklyr包提供了一个完整的dplyr后端,可筛选并聚合Spark数据集,接着在R中实现分析与可视化: 利用Spark的MLlib机器学习库在R中实现分布式机器学习算法: 可以创建一个扩展,用于调用Spark API,并为Spark的所有包集提供了一个接口. 2.RStudio Server安装sparklyr包 Linux版本:Ubuntu 16.04 LTS 64bit

java编程思想第四版中net.mindview.util包下载,及源码简单导入使用

在java编程思想第四版中需要使用net.mindview.util包,大家可以直接到http://www.mindviewinc.com/TIJ4/CodeInstructions.html 去下载,并按照所在页面的操作进行操作.当然也可以直接我下载下面的链接,下载的直接是JAR包,可以直接导入并使用: net.mindview.util包:百度网盘:点击下载  密码: ggpi java编程思想第四版源码:百度网盘:点击下载  密码: ur3e 下面我简单的介绍一下源码在Eclipse中的导

sun.misc.BASE64Encoder问题,jdk包里有包但找不到类

我们在使用base64编码解码的时候,使用Base64Encoder类,发现jdk包里能找到这个了,但是程序报错.这是因为Base64Encoder并不属于JDK标准库范畴,但是又包含在了JDK中. 解决办法1:可以在系统环境变量中加入rt.jar包 2: 还有个其他小问题,有的包带个文件的标志如下图:带文件的时系统依赖包,不带的时第三方依赖包.开发时候用到的就是开发依赖包你运行的时候,需要tomcat提供支持的就是容器依 赖包开发和运行不同,故有jdk和jre 两部分

Android Support 包里究竟有什么

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 随着 Android 5.0 Lollipop 的发布,Android 又为我们提供了更多的支持包,但是我相信大部分开发者都同我之前一样不知道这些包里究竟有些什么东西,我们应该在什么时候使用它.现在,我们就来逐个看看每一个版本的 Support 包中所拥有的东西,让用到他的时候不再迷茫. 首先,你需要了解

[Android Pro] Android Support 包里究竟有什么

reference to : http://www.2cto.com/kf/201411/350928.html 随着 Android 5.0 Lollipop 的发布,Android 又为我们提供了更多的支持包,但是我相信大部分开发者都同我之前一样不知道这些包里究竟有些什么东西,我们应该在什么时候使用它.现在,我们就来逐个看看 每一个版本的 Support 包中所拥有的东西,让用到他的时候不再迷茫. 首先,你需要了解每一个 Support 包版本后缀 vX 所代表的含义.当然我相信来看博客的诸