Java回调函数与观察者模式实例代码
作者:司马懿字仲达 发布时间:2023-11-16 17:30:11
本文研究的主要是Java回调函数与观察者模式的实现,具体介绍和实现代码如下。
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
什么时候使用观察者模式:
当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。
其实观察者模式同前面讲过的桥梁、策略有着共同的使用环境:将变化独立封装起来,以达到最大的重用和解耦。观察者与后两者不同的地方在于,观察者模式中的目标和观察者的变化不是独立的,而是有着某些联系。
在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。
package com.demo.test;
import java.util.Observable;
import java.util.Observer;
//观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用
public class ObserverCallbackDemo {
// 观察者A
static class ConcreteObserverA implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ConcreteObserverA update");
}
}
// 观察者B
static class ConcreteObserverB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("ConcreteObserverB update");
}
}
// 被观察对象
static class ConcreteObservable extends Observable {
public void changeValue() {
//protected方法只能在子类被调用
setChanged();
notifyObservers();
}
}
// 回调函数接口
interface ICallback {
public void onCall();
}
// 回调类
static class CallbackDemo {
private ICallback callback;
public void setListener(ICallback callback) {
this.callback = callback;
}
public void call() {
callback.onCall();
}
}
public static void main(String[] args) {
// 观察者
ConcreteObserverA observerA = new ConcreteObserverA();
ConcreteObserverB observerB = new ConcreteObserverB();
ConcreteObservable observable = new ConcreteObservable();
observable.addObserver(observerA);
observable.addObserver(observerB);
System.out.println("countObservers = " + observable.countObservers());
observable.changeValue();
// 回调函数
CallbackDemo callbackDemo = new CallbackDemo();
callbackDemo.setListener(new ICallback() {
@Override
public void onCall() {
System.out.println("callback onCall");
}
}
);
callbackDemo.call();
}
}
输出结果:
countObservers = 2
ConcreteObserverB update
ConcreteObserverA update
callback onCall
总结
从上面代码可以看出:回调函数应该属于观察者模式的一种,目的是为了替代轮循机制,将组件之间的耦合性降低。观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用。
来源:http://blog.csdn.net/chy555chy/article/details/52777989


猜你喜欢
- 截取字符串最后一位1.用substring()来截取理论上它是按照字符串.substring(字符串.lastIndexOf("\
- 介绍环境配置Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEcl
- 1.官网下载JDK:1.1下载地址:https://www.oracle.com/java/technologies/javase-down
- java 计算同比增长工具类为了数据的严谨性,统一装换为BigDecimal,话不多说,看代码。package com.pig4cloud.
- 1.新建文件上传页面在static目录中新建upload-test.html,上传页面代码如下所示:<!DOCTYPE html>
- Java类加载器1、BootClassLoader: 用于加载Android Framework层class文件。2、PathClassLo
- 可以给已有实体类动态的添加字段并返回新的实体对象,不影响原来的实体对象结构。添加依赖<dependency> &n
- 工厂模式工厂模式顾名思义就是生产实例的工厂,使用工厂模式不会在程序中使用new关键字创建实例。而是将创建对象的细节隐藏,对外提供统一的方法,
- 定时器问题定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的
- 有些手机在电话接通后会有振动提示,这有个好处就是可以等到接通后再放到耳边接听,减少辐射。本文就讲讲如何在Android手机中实现这种接通电话
- 最近这学期做了一个java迷宫的课程设计,这里代码及其算法逻辑就分享出来。首先简单的说一下其中我使用的算法(自动生成地图:递归分割法、递归回
- Java的位操作符用来操作整数基本数据类型中的单个“比特”(bit),即代进制位。而我们知道比特就是0和1,那么,位操作就是对这些数据进行基
- 此项目使用了OpenCVSharp加载本地摄像头,多个摄像头支持切换展示,也可以展示rtsp地址。使用NuGet如下:代码如下一、创建Mai
- 本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法。分享给大家供大家参考,具体如下:在使用ImageView时
- 本文实例为大家分享了Android五子棋游戏的具体代码,供大家参考,具体内容如下1、效果图:2、GobangPanel棋盘面板:public
- 知乎的广告效果一直想写,无奈最近才有时间。先看效果:肯定要自定义view了,一个类似imageView的控件,还要给它一个值用来指定广告图片
- 排序算法很多地方都会用到,近期又重新看了一遍算法,并自己简单地实现了一遍,特此记录下来,为以后复习留点材料。废话不多说,下面逐一看看经典的排
- Spring Bean的生命周期?首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;Sp
- 定义:结点的带权路径长度为从该结点到树根之间的路径长度与结点上权的乘积。树的带权路径长度为树中所有叶子结点的带权路径长度之和。假设有n个权值
- 一、什么是封装?封装就是将属性私有化,提供公有的方法访问私有属性。做法就是:修改属性的可见性来限制对属性的访问,并为每个属性创建一对取值(g