`

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  




相关推荐

    Java利用接口实现回调

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

    java接口回调

    当我们谈论“Java接口回调”时,核心思想是:一个类通过实现特定接口,将自身的某个方法暴露给其他对象调用,当特定事件发生或任务完成时,调用这个暴露的方法进行后续处理。 接口回调在Java中的应用广泛,例如在...

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

    在这个Java版的实现中,我们将探讨如何利用URL接口回调来处理支付流程。 首先,我们需要理解URL接口回调的基本概念。在微信支付中,当用户完成支付后,微信服务器会主动向商家设定的回调URL发送一个POST请求,携带...

    TrustPayClient-Java-V3.1.7.zip

    4. **通知机制**:农行支付接口具有回调通知机制,当支付状态发生变化时,如支付成功或退款完成,农行会通过约定的回调URL向商户服务器发送通知,SDK提供了相应的处理逻辑,确保消息的准确接收和处理。 5. **安全...

    接口回调demo

    在Java编程中,接口回调是一种常见的设计模式,用于实现对象之间的通信和事件处理。当我们谈论“接口回调”时,我们通常是指一个类实现了接口,并在特定条件下调用接口中的方法来通知其他对象某个操作已完成或者发生...

    rabbitmq-java-client-bin-3.3.4.zip

    - **BasicConsume**:消费者用于开始消费消息的API,通常伴随着一个回调函数处理接收到的消息。 - **MessageProperties**:定义消息的属性,如内容类型、优先级等。 使用RabbitMQ Java客户端时,开发人员需要考虑...

    yop-java-sdk-2.1.4.zip

    4. **交易流程**:一个典型的支付流程包括发起支付请求、用户确认支付、服务器端接收支付结果通知、以及处理回调。SDK会提供相应的接口协助开发者完成这些步骤。 接下来,我们分析压缩包内的内容: - **附件.txt**...

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

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

    android接口回调详解、简单例子+复杂例子

    在Android开发中,接口回调是一种常见的通信机制,用于在组件之间传递信息,特别是在异步操作中,如网络请求、文件读写等。接口回调能够帮助我们处理这些操作的结果,使得程序更加灵活和响应式。本篇文章将深入讲解...

    包含alipay-sdk-java-1.0.0.jar,alipay-trade-sdk-1.0.0.jar

    3. **异步回调**:对于支付等重要操作,支付宝会通过异步通知(即`notify_url`)来告诉商户交易结果,需要设置正确的回调地址并处理通知。 4. **版本更新**:定期检查SDK是否有新版本,及时升级以获取最新的功能和...

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

    在企业微信的开发中,回调配置是至关重要的一个环节,它允许系统在特定事件发生时自动调用预先设定的接口,进行数据同步或业务处理。本案例将详细讲解如何使用Java来实现企业微信的回调配置,并提供相关的工具代码...

    农业银行接口Java-Demo-V3.1.6

    在TrustPayClient-Java接口文档中,开发者可以找到关于请求参数的定义,如订单号、金额、交易类型等,以及响应格式和错误处理机制。 2. **Java实现**: - 这个Demo是用Java语言实现的,因此对于Java开发者来说非常...

    alipay.trade.page.pay-JAVA-UTF-8.zip

    在这里,开发者可能会找到与支付接口交互的Servlet或Controller,这些代码负责处理来自客户端的支付请求,以及接收和解析支付宝的回调通知。 ".settings"目录存储了项目的特定配置,如编译器设置、代码格式化规则等...

    android接口回调

    在Android开发中,接口回调是一种常见的通信机制,用于在不同组件之间传递信息,尤其是在异步操作完成后更新UI或执行其他后续操作时。本篇将详细阐述Android接口回调的基本概念、实现方式以及其在实际开发中的应用。...

    java的接口回调示例代码

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

    理解接口回调

    在Android开发中,接口回调是一种常见的编程模式,用于在组件之间进行通信,特别是当需要一个组件(如Activity或Fragment)响应另一个组件的行为时。本文将深入探讨接口回调的概念,以及如何在Android环境中有效地...

    jpush-api-java-client-3.3.3.zip极光推送

    - **接收反馈**:极光推送支持用户交互反馈,例如点击通知的回调信息,开发者可以通过反馈API获取这些信息。 6. **官方文档**: 开发者应参考官方文档(https://github.com/jpush/jpush-api-java-client)以获取...

    java-openjdk1.8-linux.tar.gz

    2. **方法引用来替代匿名内部类**:在处理事件监听器或其他需要回调的地方,可以使用方法引用来代替匿名内部类,使得代码更加简洁。 3. **默认方法**:接口中可以定义带有实现的方法,这允许在不破坏向后兼容性的...

    接口回调实现简易购物车功能

    在编程领域,接口回调是一种常见的设计模式,它允许一个对象在另一个对象完成特定操作后接收通知或执行相应的处理。在本示例中,“接口回调实现简易购物车功能”着重展示了如何利用接口回调来构建一个简单的购物车...

    weixin-java-pay-demo-master_微信支付java_DEMO_微信支付_

    6. **支付结果页面跳转**:在用户完成支付后,微信会将支付结果通过回调地址返回给商户,商户需要处理这个结果并引导用户回到适当的应用页面。DEMO中会展示如何处理这种跳转逻辑。 7. **微信支付SDK的使用**:DEMO...

Global site tag (gtag.js) - Google Analytics