在一些动态语言中,如python,JavaScript等比较灵活,有函数指针的概念【C语言中的函数指针】。其意思是把一个函数当成一个参数传递到另一个函数中,在合适的时候,为指定参数提供运行入口,实现隐式控制内部参数。
引出问题
这里引出问题:假如需要设计一个要求,需要对二叉树中每一个节点设计一个自定义访问的要求,即需要外界传递一个要求【抽象为函数】,对内部遍历每一个节点实现自定义访问,你会如何设计呢??
在python等动态语言中,可能你会想到使用一种叫回调函数的设计方式。简单用代码解释以下
这里对一个数组中的每一个元素访问,模拟外界的自定义要求为对每一个迭代的元素都加100的自定义操作【这里只是简单的加100自定义,真正业务代码不会那么简单】,代码如下:
In [1]: def backing(l,fun):
...: for i in l:
...: fun(i)
...:
In [2]: def fun(i):
...: print(i+100)
...:
In [3]: backing([1,2,3,4,5,6],fun)
101
102
103
104
105
106
那么在java中又如何实现呢? 对java有一定了解的小伙伴肯定知道java压根就没有这样的语法和规定,那么java是如何实现这个要求呢? 这里就需要知道一下java是有接口这个概念的!不知道接口的小伙伴可以自行百度一下,很简单~
实现方式如下:
public class test {
public static void main(String[] args) {
//外界实现这个访问器接口来对Demo内部数据的自定义访问,这里也可以使用lambda实现
Demo<Integer> demo = new Demo<Integer>(new Demo.Visitor<Integer>() {
@Override
public void visit(Integer integer) {
System.out.println(integer+100);
}
});
Integer[] arr = {1,2,3,4,5,6,7,8,9,10};
demo.print(arr);
}
}
@SuppressWarnings("unchecked")
class Demo <E>{
private Visitor<E> visitor=null;
//构造器提供一个有参,让外界传递一个访问器给内部
public Demo(Visitor<E> visitor){
this.visitor = visitor;
}
public Demo(){
}
public void print(E[] arr){
for (E e : arr) {
//假如visitor不为空即使用访问器实现外部对内部数据的自定义访问
if(visitor!=null){
visitor.visit(e);
}else{
System.out.println(e);
}
}
}
//设计一个访问器接口供外界实现
public interface Visitor<E> {
void visit(E e);
}
}
好了,以上就是所有内容了~~~