Java回调:补充资料

什么是好莱坞原则中,yqj2065大话连篇,木有代码。这里补充一点代码。

1.回调以通知取代轮询

在分层架构中,上层模块Client调用了下层模块Server的copy()方法,上层并不清楚复制的进度而只有下层的Server才知道。上层获得进度数据的方式:轮询和通知。通知的代码见回调与Java8的λ表达式

轮询。下层模块Server0将进度数据保存在一个成员变量x中,并提供getX()。Client通过轮询访问该数据。

轮询方式下,一个线程中Server0努力的复制,主线程则在while(true)中随时随地的查询数据,直到复制进度数据为100才结束。

package principle.callback.sub;
public class Server0{
    private int x;//复制工作的进度
    public int getX(){ return x;    }
    public void copy() {
        while(x<100){
            try{
                Thread.sleep(10);
                x++;
            }catch(InterruptedException e){}
        }
    }
}

package principle.callback;
import principle.callback.sub.Server0;
public class Client0{
    private Server0 server =new Server0();
    public void call() {  server.copy();  }

    public static void test() throws InterruptedException{
        Client0 c =new Client0();
        Runnable r = ()->c.call();
        new Thread(r).start();
        System.out.print("进度:");
        int x2 = 0;
        while(true){
            int x1 = c.server.getX();///10
            Thread.sleep((int)(Math.random()*100));
            if(x2 >=100){
                System.out.println();
                break;
            }
            if (x2 != x1) {
                System.out.print(x1+"% ");
                x2 = x1;
            }
        }
    }
}

下面是两次测试的结果。

进度:3% 5% 9% 16% 21%23% 29% 31% 38% 48% 57% 63% 70% 76% 82% 85% 87% 88% 90% 91% 97% 100%

进度:1% 6% 12% 16% 24%31% 39% 47% 49% 54% 61% 64% 67% 77% 83% 90% 100%

轮询方式的优点:上层模块能够随时随地的了解所需的数据(不会被下级欺瞒),依赖关系和方法调用关系都很明确;下层模块代码简洁。缺点:上级时刻盯着下级干活,比较讨嫌;获得数据时执行太多的调用(特别是在网络编程如远程方法调用时,这是不能够容忍的);

2. 回调与多态

讨论回调、好莱坞原则时,都强调了其应用场景:分层架构。那么在非分层架构中,这些思路和技术难道不可以使用吗?如果能够使用,回调、好莱坞原则的概念是否应该推广到更一般的场合——普通类之间的设计?

答案是:在同层中,程序员依然可以使用该技术,它也是解决类之间相互依赖的重要手段。之所以强调其应用场景是分层架构,因为分层强制性地要求依赖的单调性,因而不得不使用回调、好莱坞原则达到反向调用的目标。程序员不得不在下层(或基础设施/框架中)定义一个Client的父类型IClient,它定义了回调callback(int)的接口。

如果不能够强制性地要求依赖的单调性,那么同一层中,回调与通常的多态,从类图和其自身代码上,没有区别。

当然,如果同一层中出现图0-5所示的循环依赖,程序员“可以”(而不是“不得不”) 定义一个B的父类型IB,这样就可以将A与B的循环依赖修改为单向依赖;然而对以程序员而言,是否修改为单向依赖是可选的。

另一方面,同一层中,回调、好莱坞原则的概念可以使用观察者模式作为代称。换言之,虽然观察者模式可以作为回调、好莱坞原则的同义词。但是,回调、好莱坞原则用于分层架构,观察者模式用于同一层中类的关系描述。

时间: 2025-01-02 19:15:40

Java回调:补充资料的相关文章

Java回调函数详解

为了了解什么是回调函数,在网上查阅了如下资料,整理如下: 资料一: 首先说说什么叫回调函数? 在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就 称为回调.在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃. 这样的解释似乎还是比较难懂,这里举个简 单的例子: 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程

Java 回调机制详解

一.说明 最近在写代码,发现 Java 回调机制蛮实用.在网上搜索部分资料以后,现在按照自己的理解进行归纳总结 ,有理解错的地方,希望大家能够帮忙指正! 先从一个很简单的 Android 开发例子说起.我们在界面上使用 Button 时,为其增加点击事件监听大概需要以下几个步骤 : ① 实例化 Button 对象,如 btn_call_back: ② btn_call_back.setOnClickListener(MainActivity.this); ③本类实现 OnClickListene

java回调函数机制

Java回调函数机制 参考了网上的一些资料,下面也做出一些总结,供初学者了解学习. 一. 概述 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调.异步调用 . 同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用: 回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 异步调用:一种类似消息或事件的机制,解决了同步阻塞的问题,它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户

Java相关框架资料及其基础资料、进阶资料、测试资料之分享

个人说明:只为分享,不为其他,愿所有的程序员们在编程的世界自由翱翔吧! 在我看来,只有不断实战,不断学习,不断积累,不断归纳总结,形成自己的核心竞争力,方能在未来竞争中脱颖而出! 程序员谨记!重要的事情说三遍! 不断学习!不断学习!不断学习! 不学习等于退步!!! 不学习等于退步!!! 不学习等于退步!!! 黑马最新Java资料及其视频: 链接:https://pan.baidu.com/s/1rQMg81V-mDkk_EZiUQwPtg 密码:190x ssm+shiro权限管理及其相关电子书

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 提供ROS接口的3D软件比较多,本章以最典型的Gazebo介绍为主,从Player/Stage/Gazebo发展而来,现在独立的机器人仿真开发环境,目前2016年最新版本Gazebo7.1配合ROS(kinetic)使用. 补充内容:http://blo

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation

ROS机器人程序设计(原书第2版)补充资料 (捌) 第八章 导航功能包集入门 navigation 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 本章三个非常重要概念:TF,SLAM,AMCL.务必掌握. 补充内容:http://blog.csdn.net/zhangrelay/article/details/50299417 第216页: 简介本章要点. 第217页: 导航综合功能包组成架构等. 补充如下: 目录 配置并使用导航功能

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB

一个例子教你理解java回调机制

网上很多例子都写的很难理解,笔者刚开始都已经弄晕菜了. 这个例子,应该是再简单,再简洁不过的了,例子目的是测试某个方法的执行时间.这里就写三个java类,一个接口,一个实现,还有一个用于测试时间的类. 要测试的方法,尽量占用执行的时间,这样明显一些,这里测试循环1000000次,并且打印出来. 测试类: public class MyMethod { public void mytest() { // TODO Auto-generated method stub for (int i = 0;

RPC框架研究(一)Java回调机制

报名了阿里中间件性能大赛,我来说是一个全新的挑战,一切从空白学起,比赛的过程也是学习的过程 是的,想让自己学好,给自己报一个比赛吧~ 就像当初学围棋,也是报了围棋比赛,为了不至于输的太惨,一个星期里学了好多东西 第一天 Java回调机制 晴 首先还是来看看赛事介绍 比赛总共分为两道题:"RPC"与"MOM",两题都需完成.我们会对"RPC"成绩(qps)进行排名,排名前100位的队伍有资格进入MOM的比赛环节,若未进入前100名直接淘汰,最终名次

Java回调理解 (step by step)

在网上搜索了许多篇关于java回调函数的文章,自己也来试了一下写了这篇博客,可能有些地方理解不到位,烦请各位大大指正. 在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 在Java里面,我们使用接口来实现回调. 模拟一个场景:一个Girl给她男朋友Man打电话,然后Man给她回复: 首先定义一个接口: package mine.callback2; public interface CallInte