design principle:java 回调与委派/委托机制
博客 design principle:模拟 android Button 控件点击事件 主要说了一下模拟 android 的 Listener 模式,其实这就是一种委派与回调机制的体现。
委派,也可以叫做委托,从字面上来理解的话,应该是委托其他类做事情而自己不做或者只做一部分工作;而回调,就是调用自己的方法。
在 java 中,这两种机制很类似,你姑且可以认为它们就是一码事。
推荐一篇博文给大家: Java中委托事件模型
java 中,实现委派和回调都是通过接口来实现的。下面举个小例子吧!
该例子是这样的(只是一个例子):
ProfessionalWorker 、SparetimeWorker 负责发射 Rocket,Rocket 类通过接口 IRocketDelegate 委派(或者说是回调) ProfessionalWorker 、SparetimeWorker自己发射。
总之,Rocket不做具体的事情。看实例代码:
IRocketDelegate.java源码
public interface IRocketDelegate { public abstract long startAtTime(); public abstract long endAtTime(); public abstract void sendDidFail(); }
共有三个方法,分别是用于计算 Rocket 发射时间、计算 Rocket 发射完毕的时间以及发送是否失败的。
Rocket.java源码
public class Rocket { IRocketDelegate delegate = null; public Rocket(IRocketDelegate delegate) { this.delegate = delegate; } private long getRocketStartTime() { long startTime = delegate.startAtTime(); return startTime; } private long getRocketEndTime() { long endTime = delegate.endAtTime(); return endTime; } public boolean isOk() { // 超时0.1秒为失败 if (getRocketEndTime() - getRocketStartTime() >= 100) { delegate.sendDidFail(); return false; } return true; } }
在这个类中,声明一个 IRocketDelegate 接口对象,使用该对象调用接口的方法。我们知道,接口不可以直接实例化,换句话说,实例化接口必须实现接口的所有方法。
那么,我们就把这些实现工作交给具体的发射者来完成。实现回调。
ProfessionalWorker.java源码
public class ProfessionalWorker implements IRocketDelegate { @Override public long startAtTime() { System.out.println("startAtTime is call-back inProfessionalWorker!"); return System.currentTimeMillis(); } @Override public long endAtTime() { System.out.println("endAtTime is call-back in ProfessionalWorker!"); return System.currentTimeMillis(); } @Override public void sendDidFail() { System.out.println("ProfessionalWorker send Rocket fail !"); } public void send() { if (new Rocket(this).isOk()) { System.out.println("ProfessionalWorker send Rocket ok !"); } } }
SparetimeWorker.java源码
public class SparetimeWorker { public void send() { boolean isOk = new Rocket(new IRocketDelegate() { @Override public long startAtTime() { System.out.println("startAtTime is call-back in SparetimeWorker !"); return System.currentTimeMillis(); } @Override public long endAtTime() { System.out.println("endAtTime is call-back in SparetimeWorker!"); return System.currentTimeMillis() + 100L; } @Override public void sendDidFail() { System.out.println("SparetimeWorker send Rocket fail !"); } }).isOk(); if(isOk) { System.out.println("SparetimeWorker send Rocket ok !"); } } }
这个类采用内部类的方式完成。
Test.java
public class Test { public static void main(String[] args) { new ProfessionalWorker().send(); System.out.println("*********************************************"); new SparetimeWorker().send(); } }
显示结果
endAtTime is call-back in ProfessionalWorker! startAtTime is call-back inProfessionalWorker! ProfessionalWorker send Rocket ok ! ********************************************* endAtTime is call-back in SparetimeWorker! startAtTime is call-back in SparetimeWorker ! SparetimeWorker send Rocket fail !
这就体现 Java 中的一句话 Don't call me,I'll call you. 其含义就是回调(或者委派/委托)。
android 中很多这样的用法,关于接口的好处还有很多,后续慢慢研究,记住一句话:面向对象面向接口编程。
design principle:java 回调与委派/委托机制的更多相关文章
- java类加载器及其委托机制
1.什么是类加载器,类加载器父子结构.BootStrap-->ExtClassLoader-->AppClassLoader,级别依次降低 2.类加载器之间的父子关系和管辖范围 3.类加载 ...
- 破坏双亲委托机制的一些情况---Tomcat和JDBC,破坏后的安全问题
采用双亲委托机制的原因 类加载器就是将字节码搬进jvm方法区的组件.我们知道,JVM识别加载进来的类是通过类加载器+类全名完成的,也就是说同一个类由不同类加载器加载进去的话就会被视为不同的类.jdk提 ...
- 关于Java类加载双亲委派机制的思考(附一道面试题)
预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 <Java_Runtime_Home>/lib下面 ...
- Java 类加载体系之 ClassLoader 双亲委托机制
Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件 ...
- ClassLoader类加载器 & Java类加载机制 & 破坏双亲委托机制
ClassLoader类加载器 Java 中的类加载器大致可以分成两类: 一类是系统提供的: 引导类加载器(Bootstrap classloader):它用来加载 Java 的核心库(如rt.jar ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Java虚拟机JVM学习05 类加载器的父委托机制
Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...
- java类加载器学习2——自定义类加载器和父类委托机制带来的问题
一.自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载 ...
- java回调机制及其实现(转)
1. 什么是回调函数 回调函数,顾名思义,用于回调的函数.回调函数只是一个功能片段,由用户按照回调函数调用约定来实现的一个函数.回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机.回调 ...
随机推荐
- day06 Request Response
rw 读写模板的设置 day05 Request Response 1. HttpServletResponse 简介 1.1 Response 的 OutputStream 输出中文的问题 1.2 ...
- Node.js OS 模块
Node.js os 模块提供了一些基本的系统操作函数.我们可以通过以下方式引入该模块: var os = require("os") 方法 序号 方法 & 描述 1 os ...
- 自写JQ控件-树状菜单控件[demo下载]
一个多月没有写博客了,最近也弄一个基于JQ的树状菜单控件,在此分享给大家.另外呢,通过这个例子分享一下怎么写JQ控件的. 事实上工作中,也是经常遇到的,有些时候自己想实现一些前端效果,用网上一些插件吧 ...
- Kafka系列之-自定义Producer
前面已经讲到了,在Kafka中,Message是由Producer产生的,Producer产生的Message会发送到Topic的指定Partition中.Producer可以有多种形式,也可以由用户 ...
- Swift基础之使用Alamofire库进行网络请求和断点下载
好久没有写过Swift相关的文章博客了,这里我就展示一下关于使用Alamofire库的方法 1.什么是Alamofire (1)Alamofire 的前身是 AFNetworking.AFNetwor ...
- Spring常用配置(二)
OK,上篇博客我们介绍了Spring中一些常见的配置,上篇博客中介绍到的都是非常常见的注解,但是在Spring框架中,常见的注解除了上篇博客提到的之外,还有许多其他的注解,只不过这些注解相对于上文提到 ...
- 从源码安装git
蛋疼的阿里云,git版本居然才1.9.只能手动安装了. 预装 apt-get update apt-get --yes install libcurl4-gnutls-dev libexpat1-de ...
- Maven简介(Maven是什么)
简介 Maven,在意第绪语中意为对知识的积累.Maven最初用来在Jakarta Turbine项目中简化该项目的构建过程.Jakarta Trubine项目有多个工程,每个工程都有自己的多个Ant ...
- Hadoop介绍
是适合大数据的分布式存储与计算平台,用java编写的开源系统,能够安排在大规模的计算机平台上,从而长进计算效率:由 HDFS.MapReduce.HBase.Hive 和 ZooKeeper等成员组成 ...
- 安卓2.x的版本使用4.x的主题
现在,还有大部分安卓开发者在开发安卓APP时使用的是2.x的SDK版本,为了兼容2.x的手机这本倒无可厚非,但最令人头痛的就是2.x版本的主题是在太丑了,这是安卓刚推出时只考虑到了实用,并没考虑到美观 ...