java 接口的观察者模式_java观察者模式
观察者模式又叫做发布-订阅(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观察者模式相关推荐
- java 接口 安全加密_Java中的安全加密
java 接口 安全加密 上一次我写关于密码学的文章时 ,我概述了Apache Shiro加密API,并展示了如何使用其两个对称密码. 我还写道:"您不需要在应用程序中加密和解密敏感数据的更 ...
- java接口方法实现_Java接口的简单定义与实现方法示例
本文实例讲述了Java接口的简单定义与实现方法.分享给大家供大家参考,具体如下: 1.接口是Java中最终要的概念,接口可以理解为一种特殊的类,里面全部是由全局常量和公共的抽象方法所组成. 2.接口的 ...
- java接口是静态_Java接口(静态方法、私有方法)
静态方法的使用 静态和对象不要紧,只和类有关系.java 接口中的私有方法code package cn.itcast.day10.demo01; /* 从Java 8开始,接口当中容许定义静态方法. ...
- java接口自动化书籍_java接口自动化优化(一)
优化extentreports在线样式改为离线加载自己项目下的样式 主要解决extentreports在线加载失败问题 上篇文章介绍了通过testng编写用例后使用extentreports作为测试报 ...
- java接口的继承_Java 接口多继承
按照理解,一般都是说Java 类是单继承,但可以实现多个接口.但是可以通过接口来实现类的多继承.(如何通过接口来实现多继承???) 那么就一直以为Java里面是单继承,今天看FutureTask源码的 ...
- java接口超时设置_java接口请求超时处理方法
//********* // 成员内部类 class CallableThread implements Callable { @Override public Result call() { try ...
- java jdk 观察者模式_java观察者模式实现和java观察者模式演化
简单的观察者模式实现 import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; impo ...
- java接口返回值_java后台调用接口并返回值
import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import j ...
- java 接口的泛型方法_Java泛型/泛型方法/通配符/泛型接口/泛型泛型擦出
从JDK1.5以后引入了三大常用新特性:泛型.枚举(enum).注解(Annotation).其中JDK1.5中泛型是一件非常重要的实现技术,它可以帮助我们解决程序的参数转换问题.本文为大家详细介绍一 ...
最新文章
- 逻辑覆盖测试(一)语句覆盖
- RESTful API 设计规范精讲
- weblogic部署ssh2应用出现异常
- python文本菜单程序_python3.x Day1 菜单程序练习
- 记一次ORM的权衡和取舍
- VMware 提示”此虚拟机被配置为64位操作系统,然而,64位操作无法进行”
- 土是独体字结构吗_205砂浆、混凝土强度等级与定额不同时,你会调整换算吗?...
- prev php,PHP prev() 函数 ——jQuery中文网
- 微软将不再把 .NET Framework API 移植到 .NET Core 3.0
- mysql更新一条语句_讲讲一条MySQL更新语句是怎么执行的?
- Race Condition是什么
- BigDecimal 加减乘除计算
- 内网KMS服务器搭建分享
- 如何成为一名机器学习算法工程师?
- 金士顿 DT101 G2 8GU盘量产全过程图解(群联篇)(2)
- 电脑桌面计算机打开不显示硬盘信息,Win10电脑下移动硬盘不显示盘符如何解决...
- 数据库迁移 软件Spoon Kettle环境搭配(本人踩过的坑)
- iq2010wifi测试软件,LitePoint IQ2010蓝牙测试仪WIFI/GPS/NFC
- coalesce()函数详解
- 一句话与中国菜刀的用法