Java 利用接口实现回调 (二)

2014-11-24 10:51:02 · 作者: · 浏览: 1
n = 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) {

ChangeNameTest.test();
EventNotifierTest.test();

}

}

/*
* 考虑这样一个应用:希望在某个事件发生时得到通知
*/
interface InterestingEvent {

public void interestingEvent();

}


class EventNotifier {

private InterestingEvent ie; //写成private List eventList可以监听多个事件
private boolean somethingHappened;

public EventNotifier(InterestingEvent ie) {
this.ie = ie;
this.somethingHappened = false;
}

public void setHappened() {
this.somethingHappened = true;
}

public void doWork() {
if (somethingHappened) {
ie.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) {

ChangeNameTest.test();
EventNotifierTest.test();

}

}
下面给出回调的模型和另一个实例以便我们更好的学习


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

class B implements A {}

class C implements A {}

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

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

class B implements A {}

class C implements A {}

class Test {
A b = new B();
A c = new C();
}
[java] view plaincopyprint /*
* 考虑这样一个应用: 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 showMyNewName() {
String newName = changer.changeName(Client.this);
System.out.println(newName);
}

public String getName() {
return clientName;
}

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