当前位置:首页 > 开发 > 编程语言 > Java > 正文

java-接口回调

发表于: 2012-11-02   作者:bylijinnan   来源:转载   浏览次数:
摘要: /* * Java里面的接口回调,最简单的情况示意如下 */ interface A {} class B implements A {} class C implements A {} class Test { A b = new B(); A c = new C(); } /* 我们重点关注——用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();
        
    }

}

java-接口回调

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
java接口回调是指:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口
​【声明】 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章
前段时间公司在紧锣密鼓的筹备一项社区商务项目,既然做电商,支付接口就必不可少,下面我们就看一
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用
彻底把回调的各种的使用都弄明白了,呵呵,记录一下。当然下面的回调是最粗浅的使用方式,昨天看了
在上一篇随笔中,搭建了一个寄宿于控制台项目的wcf服务和客户端.今天晚上时间比较充裕,看了下wcf的消
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.serviceModel&g
回调这种思想大家应该都用过,只是很多人不知道那是回调的一种罢了,前几天整理了一下自己对于回调
  有点类似模板的功能,可以使用函数指针作为参数,当调用函数时,使用void *进行传递参数,细致
1. 什么是回调函数 回调函数(callback Function),顾名思义,用于回调的函数。 回调函数只是一个
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号