• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)

详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了闭包与回调,java闭包,java中的闭包,鬼怪详谈祥云寺,详谈等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

最近一直在看Java的相关东西,因为我们在iOS开发是,无论是Objective-C还是Swift中,经常会用到委托代理回调,以及Block回调或者说是闭包回调。接下来我们就来看看Java语言中是如何实现委托代理回调以及闭包回调的。当然这两个技术点虽然实现起来并不困难,但是,这回调在封装一些公用组件时还是特别有用的。所以今天,还是有必要把Java中的委托代理回调以及闭包回调来单独的拿出来聊一下。

本篇博客我们依然依托于实例,先聊聊委托代理回调的实现和使用场景,然后再聊一下使用匿名内部类来进行回调,其实就是我们常说的“闭包”回调。闭包回调的实现方式其实就是匿名内部类的使用。既然本篇博客我们使用到了匿名内部类,我们就再聊一下Java中的内部类的相关东西。

一、委托代理回调

在iOS开发中,我们经常使用到委托代理回调,想TableView、CollectionView等等,这些高级控件会依赖于委托回调来完成一些配置。当然在Java中委托代理回调也是非常有用的,接下来我们就来看一下Java中的委托代理回调。当然在Swift或者OC中的委托代理回调是依托于“协议”的,Swift或者OC中的“协议”其实就是Java语言中的“接口”。所以在Java中的委托代理回调,依然要依托于“接口”来实现。

1、类图

首先我们给出该部分实例的类图,然后我们根据下方的类图来设计实现我们的具体代码。下方就是本部分所设计Demo的类图,当然,从类图中我们也能直观的看到,该示例是比较简单的,一共也就是一个接口两个类。CustomDelegate这个接口是代理类要实现的接口,其中包含了代理类要实现的方法。

从下方的类图中我们可以看出,代理类FirstClass实现了CustomDelegate代理接口,并实现了相关的代理方法。而SecondClass依赖于CustomDelegate接口,也就是说只要是实现了CustomDelegate接口的类都可以作为SecondClass的代理。而FirstClass中含有SecondClass类型的属性,并且FirstClass又实现了CustomDelegate接口,在FirstClass中,我们将secondClass对象的代理类指定为FirstClass,稍后我们在具体实现时将会介绍到。

  

2、代码的具体实现

根据上述类图,我们很容易的就可以给出相应的代码实现。接下来我们就根据上述类图来给出具体的代码实现。

(1)、CustomDelegate的代码实现

下方代码段就是CustomDelegate的具体实现。当然该接口的实现比较简单,就一个setValue(String value)方法。该方法的具体作用是用来相应参数回调的。下方我们会用到该方法。

package com.zeluli.callback.delegate;

public interface CustomDelegate {
  public void setValue(String value);
}
</div>

(2)、SecondClass的代码实现

CustomDelegate实现完毕后,接下来我们就来实现一下SecondClass的具体代码。下方代码段就是SecondClass的具体代码实现了。我们从具体实现中可以明确看出,SecondClass类中有个私有的delegate属性,该属性是CustomDelegate类型的,所以SecondClass依赖于CustomDelegate类型。

在SecondClass的构造方法中,我们为delegate指定了具体的对象,然后调用了begin()方法。begin()方法中做的事情也是比较简单的,就是使用了Java中自带的定时器,然后在特定时间的间隔中执行delegate对象的setValue()方法,并且将当前的时间传给setValue()方法。

package com.zeluli.callback.delegate;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class SecondClass {
  private CustomDelegate delegate;

  public SecondClass(CustomDelegate delegate) {
    this.delegate = delegate;
    this.begin();
  }
  
  public void begin() {
    TimerTask task = new TimerTask() {
      @Override
      public void run() {
        delegate.setValue(getNowDate());  //执行委托代理回调方法
      }
    };
    
    long delay = 0; 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(task, delay, 1000); 
  }
  
  private String getNowDate() {
    Date currentTime = new Date();
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String dateString = formatter.format(currentTime);
    return dateString;
  }
}
</div>

(3)、FirstClass的创建

接下来我们来创建委托代理类,也就是我们的FirstClass类。其中的代码也是比较简单的,FirstClass类实现了CustomDelegate的相关方法,然后为secondClass对象指定了代理对象就是当前类的对象。具体代码如下所示。

package com.zeluli.callback.delegate;

public class FirstClass implements CustomDelegate {
  private SecondClass secondClass;
  
  public void beginRunSecondDelegateMethod() {
    if(this.secondClass == null) {
      this.secondClass = new SecondClass(this);
    }
  }

  //secondClass回调要执行的方法
  @Override
  public void setValue(String value) {
    System.out.println("第二个类回调过来的值:" + value);
  }

}
</div>

3、测试用例和运行结果

接下来我们来看一下上述代码的测试用例和运行结果。下方代码段就是我们的测试用例,代码比较简单,就是实例化了一个FirstClass的类对象firstObj,然后调用相应的方法为其中的secondClass指定代理方法即可,具体如下所示。

package com.zeluli.callback.delegate;

public class Main {
  public static void main(String[] args) throws InterruptedException {
    FirstClass firstObj = new FirstClass();
    firstObj.beginRunSecondDelegateMethod();
  }
}
</div>

下方就是上述代码的运行结果,我们可以看出定期会执行FirstClass中的setValue()方法。

  

二、闭包回调

上面我们实现了委托代理回调,接下来我们来对上述示例进行改造。将其改成匿名内部类的实现方式,也就是使用闭包的形式来实现回调。我们只需要讲FirstClass进行修改即可。将其委托代理回调修改成闭包回调的形式。下方代码段就是我们修改后的FirstClass类的源代码。

从下方的源代码可以看出,FirstClass并没有实现CustomDelegate接口。在为SecondClass的对象指定委托代理对象时,我们传入的是一个匿名内部类的对象,而这个对象的类型是CustomDelegate。这种用法,也是匿名内部类的使用方式之一。

  

修改后的代码的测试用例以及运行结果与之前第一部分的委托代理回调的方式一致,在此就不做过多赘述了。

三、内部类

既然,上述我们使用到了匿名内部类,那么接下来的这部分我们就来看看内部类的相关内容。内部类,顾名思义,就是定义在接口、类、方法等结构的内部的类。而匿名内部类,就是没有名字的内部类,这一点也是比较好理解的。下方我们分别从迭代器的示例以及工厂模式的示例中来窥探一下内部类的具体使用场景及使用规则。当然这两个示例所针对的内部类的角度不同。

1、迭代器中的内部类

在之前的文章中,我们详细的聊了迭代器模式,当然之前的迭代器我们是使用的Swift3.0来实现的,今天我们就用Java的内部类来实现一个Java中的迭代器。

(1)、迭代器接口

按照之前的介绍迭代器的套路,我们还是先要创建迭代器接口的。下方的Selector就是我们创建的迭代器接口。

end()方法用来判断序列是否到达了结尾处。

current()方法则用来获取当前序列中下标的值。

next()方法则是移动下标到下一个位置。

为了统一迭代器使用规范性,所有的迭代

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)
  • 详谈Java编程之委托代理回调、内部类以及匿名内部类回调(闭包回调)

相关文章

  • 2017-05-28spring mvc 使用kaptcha配置生成验证码实例
  • 2017-05-28Java数组优点和缺点_动力节点Java学院整理
  • 2017-05-28java 面试题闰年判断详解及实例
  • 2017-05-28SpringMVC结合ajaxfileupload实现文件无刷新上传代码
  • 2017-05-28Java String 和StringBuffer的详解及区别
  • 2017-05-28详解Spring boot上配置与使用mybatis plus
  • 2017-05-28java中 String和StringBuffer的区别实例详解
  • 2017-05-28java后台利用Apache poi 生成excel文档提供前台下载示例
  • 2017-05-28Java中的浮点数分析
  • 2017-05-28JFileChooser实现对选定文件夹内图片自动播放和暂停播放实例代码

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理
    • java连接mysql数据库的方法
    • Java 中 String,StringBuffer 和 StringBuilder 的区别及用法
    • Java HTTP协议收发MQ 消息代码实例详解
    • java中建立0-10m的消息(字符串)实现方法
    • Spring Boot使用Druid和监控配置方法
    • Java JVM原理与调优_动力节点Java学院整理
    • java 实现汉诺塔详解及实现代码
    • Map获取键值,Map的几种遍历方法总结(推荐)
    • Java Annotation详解及实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有