java中接口的妙用(一):
1). IEvent.java:
package com.myjava.test;
//接口
public interface IEvent {
void OnEvent(int event, int data);
}
2). Func.java
package com.myjava.test;
//调用者
public class Func {
int type;
public Func(int type) {
this.type = type;
}
public void Func1(final IEvent listener) {
//do something,
if (type == 1) {
listener.OnEvent(1, 10);
}else if (type == 2){
//do another thing
listener.OnEvent(2, 10);
}
}
}
3). JavaTest.java
public class JavaTest {
/**
* @param args
*/
public static void main(String[] args) {
JavaTest jt = new JavaTest();
//test case2: interface
jt.test2(1);
}
public void test2() {
Func f = new Func(2);
//实现interface
f.Func1(new IEvent() {
public void OnEvent(int event, int data) {
switch(event) {
case 1:
System.out.println("res +:" + event + ";" + (data+10));
break;
case 2:
System.out.println("res -:" + event + ";" + (data-10));
break;
default:
System.out.println("res donothing");
break;
}
return;
}
});
}
}
三. 说明:
1. 调用者是Func1,实现是new IEvent(注意:这里是直接用new关键字,即匿名实现),二者彻底分离,interface作为参数。
2. IEvent是interface,可我们照样用了new关键字,但必须同时要实现,而不能在外面实现;这种方式称为匿名实现,和匿名类中的匿名的理解方式一样。
3. 功能的理解(使用场合): 调用者由于不同的场合或条件,会以不同的参数调用interface的函数,从而达到不同的目的。同时,实现者(OnEvent函数)需要根据不同的
参数做出不同的动作,这时,就可以用这种模式了。
4. 特点: 实现与调用者分离,通过interface来建立二者的关系;匿名实现接口的使用技巧。
5. 补充:当然,这里,也可以不用匿名类,而是实现一个类,这个类implements接口,调用的时候,将这个类的实例传到调用者中。如下:
public void OnEvent(int event, int data) {
switch(event) {
case 1:
System.out.println("res +:" + event + ";" + (data+10));
break;
case 2:
System.out.println("res +:" + event + ";" + (data+10));
break;
default:
break;
}
}
private void test3() {
EventImpl impl = new EventImpl();
Func f = new Func(2);
f.Func1(impl);
}
}
一. 本例功能:
接口作为参数,将调用者和实现彻底分离。
1). IEvent.java:
package com.myjava.test;
//接口
public interface IEvent {
void OnEvent(int event, int data);
}
2). Func.java
package com.myjava.test;
//调用者
public class Func {
int type;
public Func(int type) {
this.type = type;
}
public void Func1(final IEvent listener) {
//do something,
if (type == 1) {
listener.OnEvent(1, 10);
}else if (type == 2){
//do another thing
listener.OnEvent(2, 10);
}
}
}
3). JavaTest.java
public class JavaTest {
/**
* @param args
*/
public static void main(String[] args) {
JavaTest jt = new JavaTest();
//test case2: interface
jt.test2(1);
}
public void test2() {
Func f = new Func(2);
//实现interface
f.Func1(new IEvent() {
public void OnEvent(int event, int data) {
switch(event) {
case 1:
System.out.println("res +:" + event + ";" + (data+10));
break;
case 2:
System.out.println("res -:" + event + ";" + (data-10));
break;
default:
System.out.println("res donothing");
break;
}
return;
}
});
}
}
三. 说明:
1. 调用者是Func1,实现是new IEvent(注意:这里是直接用new关键字,即匿名实现),二者彻底分离,interface作为参数。
2. IEvent是interface,可我们照样用了new关键字,但必须同时要实现,而不能在外面实现;这种方式称为匿名实现,和匿名类中的匿名的理解方式一样。
3. 功能的理解(使用场合): 调用者由于不同的场合或条件,会以不同的参数调用interface的函数,从而达到不同的目的。同时,实现者(OnEvent函数)需要根据不同的
参数做出不同的动作,这时,就可以用这种模式了。
4. 特点: 实现与调用者分离,通过interface来建立二者的关系;匿名实现接口的使用技巧。
5. 补充:当然,这里,也可以不用匿名类,而是实现一个类,这个类implements接口,调用的时候,将这个类的实例传到调用者中。如下:
//将下面代码加入到JavaTest.java中,即可使用。
//实现interface
class EventImpl implements IEvent {public void OnEvent(int event, int data) {
switch(event) {
case 1:
System.out.println("res +:" + event + ";" + (data+10));
break;
case 2:
System.out.println("res +:" + event + ";" + (data+10));
break;
default:
break;
}
}
private void test3() {
EventImpl impl = new EventImpl();
Func f = new Func(2);
f.Func1(impl);
}
}
6. 从5中的例子可以看出,我们既不需要修改Func.java,也不需要修改IEvent.java,只需要修改IEvent接口的实现即可,对于在一个系统中,很多类都需要实现同一个接口,并且调用者的函数形式也一致,就可以用这种方式了。
7. 以上实例,是从项目中抽象出来,进行简化加工后的实现。
8. 测试结果:
res -:2;0