在Java中通过Observable类和Observer接口实现了观察者模式。实现Observer接口的对象是观察者,继承Observable的对象是被观察者。

1. 实现观察者模式
实现观察者模式非常简单,
[1]创建被观察者类,它继承自java.util.Observable类;
[2]创建观察者类,它实现java.util.Observer接口;
[3]对于被观察者类,
添加它的观察者:
void addObserver(Observer o)
addObserver()方法把观察者对象添加到观察者对象列表中。
当被观察事件发生时,执行:
setChanged();
notifyObservers();
setChanged()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
只有在setChange()被调用后,notifyObservers()才会去调用update()。
[4]对于观察者类,实现Observer接口的唯一方法update
void update(Observable o, Object arg)
形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。
下面给出一个简单的示例:
package designpattern_observer;import java.util.Observable;public class MyButtonObserable extends Observable {private String clickMode;public String getClickMode() {return clickMode;}public void setClickMode(String clickMode) {this.clickMode = clickMode;this.setChanged();this.notifyObservers(clickMode);}
}

package designpattern_observer;import java.util.Observable;
import java.util.Observer;public class MyTextBoxAbserver implements Observer {@Overridepublic void update(Observable o, Object arg) {if (arg.toString().equals("double clicked")) {System.out.println("你对按钮执行了双击操作.");}}
}

Test类:

package designpattern_observer;public class ObserverTest {public static void main(String[] args) {MyButtonObserable button = new MyButtonObserable();MyTextBoxAbserver textbox = new MyTextBoxAbserver(); button.addObserver(textbox);button.setClickMode("double clicked");}
}

执行入口函数,调用 button.setClickMode("double clicked"),则触发MyTextBoxAbserver 对象的update方法,打印输出:

你对按钮执行了双击操作.

Java中使用Observer接口和Observable类实践Observer观察者模式相关推荐

  1. Java中的Type接口和Class类区别和联系

    Java中的Type接口和Class类有什么区别 Type是Class的父接口. Type 是 Java 编程语言中所有类型的公共高级接口.它们包括原始类型.参数化类型.数组类型.类型变量和基本类型. ...

  2. Java中的Type接口和Class类有什么区别

    https://blog.csdn.net/linghuainian/article/details/86137810

  3. Java中的某些接口为什么没有任何方法?

    java中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法. 这些没有任何方法声明的接口又被叫做标识接口.标识接口对实现它的类没有任何语义上的要求,仅仅充当标识的作用,用来 ...

  4. Java中抽象类和接口在概念、语法和应用上的区别和关系

    2019独角兽企业重金招聘Python工程师标准>>> 春招开始了,盆友们都忙着准备笔试.准备面试,复习学过的知识点,当然我也不例外,在这里祝每一个"有心人"心想 ...

  5. 关于Java中抽象类和接口的一点思索

    Java中抽象类和接口的一点思索 成员方法上的区别: 1. java中的抽象类可以提供成员方法的实现细节,抽象方法只能是被public和protected来修饰 配合abstract关键字,子类需要实 ...

  6. Struts2框架中的Action接口和ActionSupport类

    Struts2框架中的Action接口和ActionSupport类 1.Action接口 2.ActionSupport类 3.登录案例 3.1.页面 3.2.控制器 3.3.struts.xml配 ...

  7. 详细解答Java中抽象类和接口的区别问题!

    接口(Interface)和抽象类(Abstract Class)是支持抽象类定义的两种机制. 一.抽象类 在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称 ...

  8. Java中Collection集合接口

    在Java中有数组,但数组不能存储引用变量.所以数组用得不是很多,一般Java中用继承Collection接口的实现类比较多.其中List接口和Set接口继承了Collection接口,而Map接口并 ...

  9. java在dog中定义name变量,组合构造 冯跃峰 java中组合的应用(不相干的类共同完成一个功能)+构造器回顾...

    java中组合的应用(不相干的类共同完成一个功能)+构造器回顾:今天我们了解到java的组合.可以说java组合是非常的重要的.可以对类进行封装,将底层的内容封装起来.甚至于java的继承都没有其重要 ...

最新文章

  1. 收集的yum命令博文
  2. Skyscrapers (easy version)CodeForces - 1313C1(暴力)
  3. 数学本是非常有趣的,只是教科书呈现的方式太死板
  4. spring 核心技术
  5. [论文笔记]QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION
  6. Async和Await简介
  7. 基于VS2015的C#的GDAl环境配置
  8. 中国企业服务总线(ESB)市场趋势报告、技术动态创新及市场预测
  9. 2021年美赛资料准备
  10. linux 登录qq虚拟机,不能输入中文
  11. inter,amd,arm公司以及x86,arm,mips等架构关系
  12. 百练_1664:放苹果_递归
  13. 云栖大会 mysql_【资料合集】2018云栖大会•深圳峰会回顾:PDF下载
  14. python基础----文件处理
  15. iOS 使用系统相册获取选取图片的名称
  16. 关于大数据技术原理与应用的学习(6)
  17. 华为路由器学习指南_BGP_路由反射器与联盟
  18. Debian10安装wine及用wine安装微信、QQ与TIM
  19. python读取文件报错:‘utf-8‘ 或“gbk” codec can‘t decode byte 0xbe in position 627: invalid start byte
  20. HTTP的常用方法、GET和POST的区别

热门文章

  1. Django_博客_XSS 攻击防范
  2. Windows Server 2016-图形化备份域控制器
  3. Docker、Kubernetes、Apache Mesos 之争 | 一个与传说不同的故事
  4. 高颜值性价比神器,乐Pro3双摄AI版带来不一样的上手体验
  5. innodb参数汇总
  6. C语言-线性表基本操作之单链表
  7. 最全的ASP.NET开源CMS汇总
  8. 如何提高软件可维护性
  9. 交换机工作原理(下)
  10. 从内存细看static