设计模式_接口回调
2013-10-15 11:10
281 查看
在java组件编程时(如Android编程)时会十分频繁的使用到接口回调,以前我都没有发现,只是照着书上写的做。最常见的就是View.setonClickListener(new View.onClickListener())这样的语句了。因为最近看得代码也渐渐多起来了,所以很自然的就发现这个问题了,然后还好现在Android中的sdk源码都是可以直接查看的,现在我明白了。
感觉接口回调也是一种多态的表现,过程就像View类中实现了onClickListener接口,即实现了onClickListener中的onClick方法。不过这个onClick方法只是一个空方法,我们使用一个继承自View的组件,如Button时,在为其注册onClickListener事件的过程中定义了具体的onClick实现方法。
其实对于接口回调的思考是源自opensudoku代码,下面是其中的代码片段:
上面的是程序主界面中listview的viewbinder类的定义,可以看到语句mDetailLoader.loadDetailAsy...这条语句,它就相当于View.setonClickListener()一样,只是没有那么直观罢了。
上面是一个实现类似Handler的方法,不过它用了ExecutorService,可以看见参数是FolderDetailCallBack接口,而方法的实现则是调用了接口中定义的空方法,该空方法就是我们在setOnClickListener中实现的onCLick方法。可能上面的描述不是很清楚,我这里写了一个简单的例子
先定义一个接口:
再定义一个实现该接口空方法的类A:
最后是一个测试类:
输出:
接口回调前的i:2
接口回调后的i:3
好了,,写的不好>.<,努力努力!以后会慢慢好的。
感觉接口回调也是一种多态的表现,过程就像View类中实现了onClickListener接口,即实现了onClickListener中的onClick方法。不过这个onClick方法只是一个空方法,我们使用一个继承自View的组件,如Button时,在为其注册onClickListener事件的过程中定义了具体的onClick实现方法。
其实对于接口回调的思考是源自opensudoku代码,下面是其中的代码片段:
private static class FolderListViewBinder implements ViewBinder { private Context mContext; private FolderDetailLoader mDetailLoader; public FolderListViewBinder(Context context) { mContext = context; mDetailLoader = new FolderDetailLoader(context); } @Override public boolean setViewValue(View view, Cursor c, int columnIndex) { switch (view.getId()) { case R.id.name: ((TextView)view).setText(c.getString(columnIndex)); break; case R.id.detail: final long folderID = c.getLong(columnIndex); final TextView detailView = (TextView)view; detailView.setText(mContext.getString(R.string.loading)); mDetailLoader.loadDetailAsync(folderID, new FolderDetailCallback() { @Override public void onLoaded(FolderInfo folderInfo) { if (folderInfo != null) detailView.setText(folderInfo.getDetail(mContext)); } }); } return true; } public void destroy() { mDetailLoader.destroy(); } }
上面的是程序主界面中listview的viewbinder类的定义,可以看到语句mDetailLoader.loadDetailAsy...这条语句,它就相当于View.setonClickListener()一样,只是没有那么直观罢了。
public void loadDetailAsync(long folderID, FolderDetailCallback loadedCallback) { final long folderIDFinal = folderID; final FolderDetailCallback loadedCallbackFinal = loadedCallback; mLoaderService.execute(new Runnable() { @Override public void run() { try { final FolderInfo folderInfo = mDatabase.getFolderInfoFull(folderIDFinal); mGuiHandler.post(new Runnable() { @Override public void run() { loadedCallbackFinal.onLoaded(folderInfo); } }); } catch (Exception e) { // this is some unimportant background stuff, do not fail Log.e(TAG, "Error occured while loading full folder info.", e); } } });
上面是一个实现类似Handler的方法,不过它用了ExecutorService,可以看见参数是FolderDetailCallBack接口,而方法的实现则是调用了接口中定义的空方法,该空方法就是我们在setOnClickListener中实现的onCLick方法。可能上面的描述不是很清楚,我这里写了一个简单的例子
先定义一个接口:
public interface MyInterface { void call(int i); }
再定义一个实现该接口空方法的类A:
public class A { public A() { } public void make(MyInterface myInterface) { int i = 2; System.out.println("接口回调前的i:" + i); myInterface.call(i); //调用回调方法 } }
最后是一个测试类:
public class B { public static void main(String[] args){ A a = new A(); a.make(new MyInterface() { @Override public void call(int i) { i = i + 1; System.out.println("接口回调后的i:" + i); } }); } }
输出:
接口回调前的i:2
接口回调后的i:3
好了,,写的不好>.<,努力努力!以后会慢慢好的。
相关文章推荐
- java中的设计模式(二)--工厂方法模式 接口回调
- 设计模式_接口回调
- [设计模式原则]第三回:接口隔离原则
- C语言的设计模式-接口隔离
- 从头认识设计模式-策略模式-05-引入设计原则:面向接口编程
- (随记五)Android设计模式解析与实战_面对对象六大原则之接口隔离原则
- ZT 设计模式六大原则(4):接口隔离原则
- 设计模式-工厂方法模式的概述和使用-接口
- java设计模式-模板方法(方法回调,钩子函数)
- 设计模式学习--面向对象的5条设计原则之接口隔离原则--ISP
- Android中设计模式--策略模式(封装会变化的算法部分,面向接口不针对实现)
- 设计模式六大原则----------接口隔离原则
- command设计模式和回调机制
- 不懂接口、反射、委托、设计模式足足写了5年的代码 -- 写给初学者(谈美女生成器不谈代码生成器)
- [设计模式](五):适配器模式(Adapter)[类适配器、对象适配器、接口适配器]
- 设计模式:一个体现Java接口及工厂模式优点的例子
- 设计模式六大原则(4):接口隔离原则
- 设计模式六大原则(4):接口隔离原则
- 设计模式:接口与抽象类的区别
- 设计模式六大原则:接口隔离原则(六)