Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。

下面是回调的基本模型:

public class A {private CallBack callback;//注册一个事件public void register(CallBack callback){this.callback = callback;}// 需要调用的时候回调public void call(){callback.oncall();}
}
public interface CallBack {public void oncall();
}
public static void main(String[] args) {A a = new A();a.register(new CallBack() {@Overridepublic void oncall() {System.out.println("回调函数被调用");}});a.call();
}

如果把类A改成Button,CallBack改成OnClickListener,register函数改成setOnclickListener,和android里面设置点击事件是一样的。callback.oncall();只是在点击事件激发后调用而已。

观察者模式:

定义对象间的一对多的依赖关系,当一个对象状态发生改变时,所有依赖他的对象都得到通知并被自动更新。

目标:

public class Subject {List<Observer> lists = new ArrayList<Observer>();//注册一个事件public void register(Observer observer){lists.add(observer);}public void _notify(){for (Observer observer : lists) {observer.update();}}public void unRegister(Observer observer){lists.remove(observer);}
}

观察者抽象接口

public interface Observer {public void update();
}

观察者1

public class ConcreteObserver1 implements  Observer{public void update() {System.out.println("ConcreteObserver1获得更新");}
}

观察者2

public class ConcreteObserver2 implements  Observer{public void update() {System.out.println("ConcreteObserver2获得更新");}
}
public static void main(String[] args) {Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();Subject subject = new Subject();subject.register(observer1);subject.register(observer2);subject._notify();//取消观察者1的注册subject.unRegister(observer1);subject._notify();
}

目标对象保存了各个观察者的引用,当需要通知时发送通知。

实际上,回调是观察者模式的简单形式。观察者模式也就是将回调上升到设计模式的理论高度上了而已。

将回调例子中的main方法改成

public static void main(String[] args) {CallBack callback = new CallBackImp();A a = new A();a.register(callback);a.call();
}

增加CallBack的实现类CallBackImp

public class CallBackImp implements CallBack{@Overridepublic void oncall() {System.out.println("回调函数被调用");}
}

这样看来,是一致的,区别是观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用。

转载于:https://www.cnblogs.com/qhyuan1992/p/5385331.html

Java设计模式-回调函数和观察者模式相关推荐

  1. 由c#事件监听、回调函数引发观察者模式

    由c#事件监听.回调函数引发观察者模式 事件监听: C#中的事件,可以简单的理解为类或者对象发生了一件事,并且把这件事通知给了其他的类或者对象,其他的类或者对象可以根据事件的消息有所反应. 这非常类似 ...

  2. java socket 回调函数_请问Java网络编程如何在不使用多线程的情况下实现异步返回?...

    我指的是在不使用多线程的情况下进行并发处理 具体的情况是,在不使用多线程的情况下,服务器侦听某个端口,在有连接进来的时候会调用某个函数对此连接进行处理,但是由于处理的过程可能会比较长,为了不让后面连接 ...

  3. Java基础:回调函数

    因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和 ...

  4. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  5. 如何理解java的回调函数?

    对于技术问题,会用是一回事,理解这个技术问题的来龙去脉.设计者当初为什么要设计这个功能.这个技术问题有哪些优势.适用哪些场景又是另外回事了. 前者照猫画虎得其形,后者形神兼备得其意,这也是所谓青铜与王 ...

  6. java jna 回调函数_JNA中级篇 回调函数详解

    JNI 技术是双向的,既可以从Java 代码中调用原生函数,也可以从原生函数中直接创建 Java 虚拟机,并调用Java 代码.但是在原生函数中调用java代码要写大量C代码,这对大多数java程序员 ...

  7. 【三】Java 设计模式学习记录:观察者模式

    文章目录 一.观察者模式(行为型模式) 1.1 场景 1.2 普通解决方案 1.3 观察者模式定义 1.4 观察者模式原理 二.代码实现 2.1 代码结构 2.2 上代码 2.3 扩展性 三. 框架应 ...

  8. Objective-C利用协议实现回调函数(类似java的回调函数)

    实现的代码如下: 定义协议: #import <UIKit/UIKit.h> @protocol NoteDelegate //回调函数 -(void)messageCallBack:(N ...

  9. java设计模式(六)--观察者模式

    转载:设计模式(中文-文字版) 目录: 简单目标任务实现 观察者模式介绍 观察者模式代码实现 观察者模式是JDK中使用最多的模式之一,非常有用.我们也会一并介绍一对多关系,以及松耦合(对,没错,我们说 ...

最新文章

  1. Windows系统下安装Thrift的方法
  2. DPM恢复Exchange 2013单个邮箱
  3. 程序开发工具java_15款Java程序员必备的开发工具
  4. obj转stl_3D打印,如何编辑STL文件?
  5. 「深入Java」类型信息:RTTI和反射
  6. linux切换root权限
  7. sql数据库基础知识整理,常用函数及常用语法
  8. Android开发之recyclerview布局加载不全的问题
  9. PHP (20140505)
  10. Python基础--Python3基础语法
  11. Java中的垃圾回收与对象生命周期
  12. linux如何查看磁盘剩余空间
  13. JavaScript 弹出窗口总结
  14. 回飞锅有哪些功能_回飞锅的精髓,只由原创者荷兰BK掌控
  15. C++socket编程(一):绪论
  16. 计算机语言排行榜2018年9月,2018年9 月编程语言排行榜JAVA稳占第一
  17. 什么情况下使用weak关键字,相比assign有什么不同
  18. Linux-用户操作
  19. 代码审计系列:审计思路学习笔记
  20. VBA编程实例----绘制李萨茹图形

热门文章

  1. Win10打不开jar程序的解决方法 [转载]
  2. python 写入excel_使用python将数据写入excel
  3. 开机f8修复电脑步骤_电脑维修实战,修复电脑开机的各种报错提示,看了不后悔...
  4. python的excel库_Python-excel相关库
  5. gen_caltab自治标定板
  6. CF401D Roman and Numbers
  7. jquery的基本api
  8. DevExpress的DateEdit设置显示日期和时间
  9. 创建MYSQL的储存过程
  10. 算法模板——二分图匹配