返回信息流方式一:
public interface Callback {
void solve(String result);
}
public class Teacher {
public void tell(Callback callback, String question) {
System.out.println("学生的问题:" + question);
String result = "答案参考课本";
callback.solve(result);
}
}
public class Student {
private Teacher teacher;
public Student(Teacher t) {
this.teacher = t;
}
public void ask(String question) {
teacher.tell(new Callback() {
@Override
public void solve(String result) {
System.out.println(result);
}
}, question);
}
@Override
public void solve(String result) {
System.out.println("老师给的结果是:" + result);
}
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student(t);
s.ask("太阳为什么会发光?");
}
}
方式二:
Callback和Teacher不变,
public class Student implements Callback{
private Teacher teacher;
public Student(Teacher t) {
this.teacher = t;
}
public void ask(String question) {
teacher.tell(Student.this, question);
}
@Override
public void solve(String result) {
System.out.println("老师给的结果是:" + result);
}
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student(t);
s.ask("太阳为什么会发光?");
}
}
方式三:
没有Callback,
public class Teacher {
public String tell(String question) {
System.out.println("问题是:" + question);
String result = "答案参考课本";
return result;
}
}
public class Student {
private Teacher teacher;
public Student(Teacher t) {
this.teacher = t;
}
public String ask(String question) {
return teacher.tell(question);
}
public static void main(String[] args) {
Teacher t = new Teacher();
Student s = new Student(t);
System.out.println(s.ask("太阳为什么会发光?"));
}
}
这三种方式似乎实现效果一样,但是不太懂不同的写法有什么好处。恳请各位同学解惑[ema23]
这是一条镜像帖。来源:北邮人论坛 / java / #57031同步于 2017/8/10
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
【问题】java的接口用法的一点疑问
king1994
2017/8/10镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
方法一,主要是因为Java不能传函数,不像JS直接扔进一个函数来回掉。所以只能扔进一个匿名类。不过Java8实现就比较叼了。
方法一,是Java中比较常见的一种回调模式的。有好多模板类采用的就是这种方法,比如spring-data-redis 里面大量用了这种方式。
还有,这个demo真是。。。。
感觉一二都是实现了回调的作用。但第三个不也是能达到一样效果吗?
【 在 EMyuan 的大作中提到: 】
: 方法一,主要是因为Java不能传函数,不像JS直接扔进一个函数来回掉。所以只能扔进一个匿名类。不过Java8实现就比较叼了。
: 方法一,是Java中比较常见的一种回调模式的。有好多模板类采用的就是这种方法,比如spring-data-redis 里面大量用了这种方式。
: 还有,这个demo真是。。。。
public interface Solver {
void solve(String question);
}
public class Teacher implements Solver {
@Override
public void solve(String question) {
System.out.println("答案参考课本");
}
}
public class Doctor implements Solver {
@Override
public void solve(String question) {
System.out.println("我是医生,啥也不懂");
}
}
public class Programer implements Solver {
@Override
public void solve(String question) {
System.out.println("Google一下");
}
}
public class Studtent {
public void ask(Solver s, String question) {
s.solve(question);
}
}
public static void main(String[] args) {
Studtent a = new Studtent();
Programer programer = new Programer();
Doctor doctor = new Doctor();
Teacher teacher = new Teacher();
a.ask(programer, "为什么");
a.ask(doctor, "为什么");
a.ask(teacher, "为什么");
}
【 在 king1994 的大作中提到: 】
: 方式一:
: [code=java]
: public interface Callback {
: ...................
我的问题可能提的不太清楚,其实是有点想问接口回调相关的问题。谢谢你的耐心解答
【 在 cayman 的大作中提到: 】
: 你举的例子接口只有唯一的实现,要不在Teacher里,要不在Student里,所以当然没有意义,三种都一样。
第三种相当于是Student主动调用的Teacher的方法,你这个场景倒是可以实现,不过Student和Teacher耦合严重,如果后面加需求就不好扩展了,例如Student还需要调ATeacher、BTeacher之类的