`

java-接口回调

阅读更多

/*
 * Java里面的接口回调,最简单的情况示意如下
 */
interface A {}

class B implements A {}

class C implements A {}

class Test {
    A b = new B();
    A c = new C();
}

/*
我们重点关注——用Java接口实现回调函数的等价功能
简单来说,就是某个类的某个函数,接收一个接口作为参数(或者直接把该接口作为field),
那么就可以在这个函数中调用接口里面的方法了,称为回调
而接口的实现可以千变万化,将不同的接口的实现类传入,就可实现不同的功能

例如:
*/
interface Hello {
    void sayHello();
}

class Man {
    
    private Hello hello;
    
    public Man(Hello hello) {
        this.hello = hello;
    }
    
    public void say() {
        hello.sayHello();
    }
    
}

class HelloTest {
    
    public static void test() {
        Man chinese = new Man(new Hello() {
           public void sayHello() {
               System.out.println("你好");
           }
        });
        chinese.say();
        
        Man english = new Man(new Hello() {
            public void sayHello() {
                System.out.println("hello");
            }
        });
        english.say();
    }
}



/*
 * 上面的例子是调用类“拥有接口”,接口是不知道调用类的
 * 若接口和调用类要交互,那他们就是相互“拥有”
 * 考虑这样一个应用: NameChanger动态地改变Client的名字
 * 那NameChanger的changeName方法就要接收一个Client对象,然后获取(调用)Client的名字并作不同的处理
 * Client也要持有NameChanger,因为要打印改变后的名字
 */
class Client {

    private INameChanger changer;
    private String clientName;
    

    public Client(INameChanger changer) {
        this.changer = changer;
    }

    public void changeNameNow() {
        String newName = changer.changeName(this);
        this.clientName = newName;
    }
    
    public String getName() {
        return clientName;
    }

    public void setName(String clientName) {
        this.clientName = clientName;
    }
    

}

interface INameChanger {
    
    String changeName(Client client);
    
}


class ChangeNameTest {
    
    public static void test() {
        
        Client client = new Client(new INameChanger(){
            public String changeName(Client client) {
                return "Mr." + client.getName();
            }
        });
        client.setName("Tom");
        client.changeNameNow();
        System.out.println(client.getName());
        
        Client client2 = new Client(new INameChanger(){
            public String changeName(Client client) {
                return "Miss." + client.getName();
            }
        });
        client2.setName("Lucy");
        client2.changeNameNow();
        System.out.println(client2.getName());
        
    }
    
}


/*
 * 考虑这样一个应用:希望在某个事件发生时得到通知
 */
interface InterestingEvent {
    
    public void interestingEvent();
    
}


class EventNotifier {
    
    private InterestingEvent event;        //写成private List<InterestingEvent> eventList可以监听多个事件
    private boolean somethingHappened;
    
    public EventNotifier(InterestingEvent ie) {
        this.event = ie;
        this.somethingHappened = false;
    }
    
    public void setHappened() {
        this.somethingHappened = true;
    }
    
    public void doWork() {
        if (somethingHappened) {
            event.interestingEvent();
        }
    }
    
}


class ButtonPressedEvent implements InterestingEvent {

    @SuppressWarnings("unused")
    private EventNotifier en;
    
    public ButtonPressedEvent() {
        en = new EventNotifier(this);
    }
    
    public void interestingEvent() {
        System.out.println("button pressed ");
    }
    
}


class EventNotifierTest {
    
    public static void test() {
        //这里有两种调用方法。其中第二种采用匿名内部类,其原理跟上面“改变Client名字”是一样的
        EventNotifier en = new EventNotifier(new ButtonPressedEvent());
        en.setHappened();
        en.doWork();
        
        EventNotifier en2 = new EventNotifier(new InterestingEvent(){
            public void interestingEvent() {
                System.out.println("inputtext change ");
            }
        });
        en2.setHappened();
        en2.doWork();
        
    }
}


//这个类是用来测试的
public class JavaInterfaceCallBack {
    
    public static void main(String[] args) {
        HelloTest.test();
        ChangeNameTest.test();
        EventNotifierTest.test();
        
    }

}

0
2
分享到:
评论
1 楼 tao_gun 2012-11-02  




相关推荐

    微信支付-商户支付模式一url接口回调-java版

    微信支付-商户支付模式一url接口回调-java版,代码清晰,可直接运行

    java实现企业微信回调配置案例

    java实现--企业微信回调配置案例及工具代码

    java的接口回调示例代码

    比如说讯飞的语音识别,我们调用它的识别方法之后不是马上就可以得到识别的结果,需要经过一段时间(网络传输耗时),但是我们不会让程序傻逼地等待它的返回结果,而是让classA实现它定义的接口IntefaceC,当讯飞的...

    接口回调demo

    接口回调、反射

    java接口回调

    所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法

    Java中的接口回调

    接口回调是多态的另一种体现。接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量可以调用被类实现的接口中的方法。当接口变量调用被类实现的接口中的方法时,是...

    java 回调函数 实现

    java 回调函数 自己模拟实现 使用了接口来完成

    Java利用接口实现回调

    在Java支持方法指针之前,Java接口不能提供一种实现回调的好方法。如果您习惯于传递在事件驱动编程模型中调用的函数指针,则您会喜欢本技巧。  熟悉MS-Windows和X Window System事件驱动编程模型的开发人员,习惯...

    opentsdb-java-sdk:用Java语言封装了openTSDB的http api

    opentsdb-java-sdk目前实现的功能查询数据,支持同步和异步写入数据,支持异步回调删除数据查询最新数据查询metric、tag_key和tag_value,支持auto_complete`源码中CrudTest类提供了一些使用说明和测试,包括并发...

    Java编程接口回调一般用法代码解析

    本文的主要内容是同过实际代码向大家展示Java编程中接口回调的一般用法,具有一定参考价值,需要的朋友可以了解下

    android接口回调

    android接口回调 handler+thread

    Java简单的回调(interface)demo

    Java简单的回调demo,写了个java最简单的回调demo,便于学习!最复杂的东西都是由简单来的,欢迎下载!

    Java接口回调一般用法

    Java接口回调一般用法:实现接口实际上和继承抽象类类似,只不过继承是在类的层面上操作,接口是在方法和常量集合的层面上操作,接口比抽象类更抽象、更简洁。可以把实现接口看成继承特定的一个或多个方法以及一些...

    nodejs调用建行互联网银企被扫支付接口加密及验签Demo+java封装jar包

    通过回调函数 得到加密串ccbParam。 nodejs调用java可以通过child_process模块中的spawn()函数实现。 var spawn = require('child_process').spawn;  nodejsJava.encryptccbParam=function(flag,param,pubKey,...

    java 接口回调实例详解

    主要介绍了java 接口回调实例详解的相关资料,所谓回调就是使用java中的多态,需要的朋友可以参考下

    Java中的接口回调实例

    今天小编就为大家分享一篇关于Java中的接口回调实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    什么是Java中的生命周期回调方法?列举一些常见的生命周期回调方法。 什么是Java中的注解处理器?如何自定义和使用注解处理器? 什么是Java中的并发编程?列举一些常见的并发类和工具。 什么是Java中的线程池?...

    Java回调机制

    Java最简单的接口回调,更详细的同步回调和异步回调见相关博客。

    C++JNI多线程回调java

    C++使用JNI多线程回调java代码例子,因为依赖了我的一些库和头文件,没有传上去,编译不过,但是大家可以参考一下,如何使用C++多线程调用java函数

Global site tag (gtag.js) - Google Analytics