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 父委托机制优点_Java虚拟机父类委托机制设计的优点
Java虚拟机父类委托机制设计的优点 昨天朋友的聊天中,讨论起了Java虚拟机的机制,父类委托机制,根加载器.扩展类加载器.应用类加载器.....说了很多,但是朋友(辉哥)的一句话,为什么这样设计呢? ...
- Java 类加载体系之 ClassLoader 双亲委托机制
Java 类加载体系之 ClassLoader 双亲委托机制 java 是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件 ...
- 36.JVM内存分哪几个区,每个区的作用是什么、如和判断一个对象是否存活、java垃圾回收机制、垃圾收集的方法有哪些、java类加载过程、类加载机制、双亲委派、Minor GC和Major GC
36.JVM内存分哪几个区,每个区的作用是什么? 37.如和判断一个对象是否存活?(或者GC对象的判定方法) 38.简述java垃圾回收机制? 39.java中垃圾收集的方法有哪些? 40.java类 ...
- 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器
28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...
- 关于Java类加载双亲委派机制的思考(附面试题)
转载自 关于Java类加载双亲委派机制的思考(附面试题) 预定义类加载器和双亲委派机制 JVM预定义的三种类型类加载器: 启动(Bootstrap)类加载器:是用本地代码实现的类装入器,它负责将 &l ...
- 打破双亲委派机制有什么用_被打破的双亲委托机制
在介绍ClassLoader之前,先提几个问题: 1.新建一个java工程,创建一个Long类,在里面写上如下代码 package java.lang;public class Long { publ ...
- Java的双亲委派机制
Java的双亲委派机制是java中类加载过程采用的机制,所以首先要理解java的类加载过程. 类加载过程:程序经过javac.exe命令以后,会生成一个或多个class字节码文件,接着使用java.e ...
- 【04-JVM面试专题-什么是双亲委派机制(父类委托机制)?如何打破双亲委派机制?双亲委派机制的优缺点?什么是沙箱安全机制呢?】
什么是双亲委派机制?如何打破双亲委派机制? JVM的双亲委派机制知道吗?怎么打破它呢?你看看自己掌握的怎么样呢? 什么是双亲委派机制?(父类委托机制) 检查某个类是否已经加载 自底向上,从Custom ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
最新文章
- 聊聊 scala 的模式匹配
- [转]linq to sql (Group By/Having/Count/Sum/Min/Max/Avg操作符)
- ES6新特性之map和reduce方法的使用
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]47.什么是Fiat-Shamir变换?
- checkbox ajax 不选中的值,php – 无法通过ajax传递checkbox的值
- chrome谷歌浏览器安装教程 20200701
- 阿里五年晋升三次,选择真的大于努力?
- 汽车编程都是用matlab,MATLAB编程与汽车仿真应用
- layui,返回的数据不符合规范,正确的成功状态码 (code) 应为:0
- C语言实例第9期:提取字符串中全部数字
- java学习代码01 范围:基本测试、标识符、数据类型、运算符、控制语句
- 异数OS国产CPU平台移植项目需求分析
- 快速截图工具——百度输入法的扩展功能
- SMAA算法详解 - SMAASearchYUp(Down)
- python发行版是什么意思_致 Python 初学者
- Android中来电号码归属地的显示
- Linux权限维持—后门篇
- 【MD】高等数学常用符号
- Arduino IDE 控制 RX8025 的完美办法(有库链接)
- 抽丝剥茧:复盘美国中央情报局CIA的复杂网络武器杀伤链