观察者模式又叫做发布-订阅(Publish/Subscribe)模式。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自己更新自己。

Observer结构图.png

Subject类,可翻译成为主题或抽象通知者,一般用一个抽象类或者一个接口实现。它把所有对观察者对象的引用保存在一个集合里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。

interface Subject {

//添加观察者

void addObserver(Observer obj);

//移除观察者

void deleteObserver(Observer obj);

//当主题方法改变时,这个方法被调用,通知所有的观察者

void notifyObserver();

}

Observer类,抽象观察者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己,这个接口叫做更新接口。抽象观察者一般用一个抽象类或者一个接口实现,更新接口通常包含一个Update()方法,这个方法叫做更新方法。

interface Observer {

public void update();

}

ConcreteSubject类,叫做具体主题或具体通知者,将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知。这里举例老师给学生布置作业。

public class TeacherSubject implements Subject {

//用来存放和记录观察者

private List observers=new ArrayList();

//记录状态的字符串

private String info;

@Override

public void addObserver(Observer obj) {

observers.add(obj);

}

@Override

public void deleteObserver(Observer obj) {

int i = observers.indexOf(obj);

if(i>=0){

observers.remove(obj);

}

}

@Override

public void notifyObserver() {

for (Observer observer:observers) {

observer.update();

}

}

public String getInfo() {

return info;

}

public void setInfo(String info) {

this.info = info;

}

}

ConcreteObserver类,具体观察者,实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态相协调,具体观察者角色可以保存一个指向具体主题对象的引用。

public class StudentObserver implements Observer {

//保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便

private TeacherSubject teacher;

//学生的姓名,用来标识不同的学生对象

private String name;

//构造器用来注册观察者

public StudentObserver(String name,TeacherSubject teacher) {

this.name=name;

this.teacher = teacher;

//每新建一个学生对象,默认添加到观察者的行列

teacher.addObserver(this);

}

@Override

public void update() {

System.out.println(name+"得到作业:"+teacher.getInfo());

}

}

测试用例

public class TestObserver {

public static void main(String []args) throws Exception {

TeacherSubject teacher=new TeacherSubject();

StudentObserver jack=new StudentObserver("jack",teacher);

StudentObserver mark=new StudentObserver("mark",teacher);

teacher.setInfo("测试题1");

teacher.notifyObserver();

teacher.setInfo("测试题2");

teacher.deleteObserver(jack);

teacher.notifyObserver();

}

}

输出结果

jack得到作业:测试题1

mark得到作业:测试题1

mark得到作业:测试题2

观察者模式在android中的应用

首先在Android中,我们往ListView添加数据后,都会调用Adapter的notifyDataChanged()方法,其中使用了观察者模式。

当ListView的数据发生变化时,调用Adapter的notifyDataSetChanged函数,这个函数又会调用DataSetObservable的notifyChanged函数,这个函数会调用所有观察者(AdapterDataSetObserver)的onChanged方法,在onChanged函数中又会调用ListView重新布局的函数使得ListView刷新界面。

java 接口的观察者模式_java观察者模式相关推荐

  1. java 接口 安全加密_Java中的安全加密

    java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...

  2. java接口方法实现_Java接口的简单定义与实现方法示例

    本文实例讲述了Java接口的简单定义与实现方法.分享给大家供大家参考,具体如下: 1.接口是Java中最终要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成. 2.接口的 ...

  3. java接口是静态_Java接口(静态方法、私有方法)

    静态方法的使用 静态和对象不要紧,只和类有关系.java 接口中的私有方法code package cn.itcast.day10.demo01; /* 从Java 8开始,接口当中容许定义静态方法. ...

  4. java接口自动化书籍_java接口自动化优化(一)

    优化extentreports在线样式改为离线加载自己项目下的样式 主要解决extentreports在线加载失败问题 上篇文章介绍了通过testng编写用例后使用extentreports作为测试报 ...

  5. java接口的继承_Java 接口多继承

    按照理解,一般都是说Java 类是单继承,但可以实现多个接口.但是可以通过接口来实现类的多继承.(如何通过接口来实现多继承???) 那么就一直以为Java里面是单继承,今天看FutureTask源码的 ...

  6. java接口超时设置_java接口请求超时处理方法

    //********* // 成员内部类 class CallableThread implements Callable { @Override public Result call() { try ...

  7. java jdk 观察者模式_java观察者模式实现和java观察者模式演化

    简单的观察者模式实现 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; impo ...

  8. java接口返回值_java后台调用接口并返回值

    import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import j ...

  9. java 接口的泛型方法_Java泛型/泛型方法/通配符/泛型接口/泛型泛型擦出

    从JDK1.5以后引入了三大常用新特性:泛型.枚举(enum).注解(Annotation).其中JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题.本文为大家详细介绍一 ...

最新文章

  1. 逻辑覆盖测试(一)语句覆盖
  2. RESTful API 设计规范精讲
  3. weblogic部署ssh2应用出现异常
  4. python文本菜单程序_python3.x Day1 菜单程序练习
  5. 记一次ORM的权衡和取舍
  6. VMware 提示”此虚拟机被配置为64位操作系统,然而,64位操作无法进行”
  7. 土是独体字结构吗_205砂浆、混凝土强度等级与定额不同时,你会调整换算吗?...
  8. prev php,PHP prev() 函数 ——jQuery中文网
  9. 微软将不再把 .NET Framework API 移植到 .NET Core 3.0
  10. mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?
  11. Race Condition是什么
  12. BigDecimal 加减乘除计算
  13. 内网KMS服务器搭建分享
  14. 如何成为一名机器学习算法工程师?
  15. 金士顿 DT101 G2 8GU盘量产全过程图解(群联篇)(2)
  16. 电脑桌面计算机打开不显示硬盘信息,Win10电脑下移动硬盘不显示盘符如何解决...
  17. 数据库迁移 软件Spoon Kettle环境搭配(本人踩过的坑)
  18. iq2010wifi测试软件,LitePoint IQ2010蓝牙测试仪WIFI/GPS/NFC
  19. coalesce()函数详解
  20. 一句话与中国菜刀的用法

热门文章

  1. 1000种对Java的响应没有死
  2. 使用Storm进行可扩展的实时状态更新
  3. Java 8中使用Lambda表达式的策略模式
  4. 使用Maven进行硒测试自动化
  5. Spring范围代理
  6. python子进程关闭fd_gpg –passphrase-fd无法使用python 3子进程
  7. MacOS使用brew无法安装Python_无法安装gdbm_无法安装autojump
  8. Linux 文件颜色含义
  9. LeetCode 面试题 03 数组中重复的数字
  10. 抱歉咯!今天偷个懒!!