interface在大型项目中的使用心得
在学校接触的都是一些小项目,感觉用不用interface都无所谓,因为不用interface我换一种方法我一样可以实现,所以就导致了只知道接口是做什么的,但置于怎么应用到项目中,在什么情况下使用接口,就摸不到头了,到公司后慢慢知道,一个项目中太大了,或许一些你写的工具类在基础库下的十多个应用都要使用,然后每个人再去直接使用它,而各个应用在使用的时候其情况要根据自己的应用有微小的差异,那怎么办?难道是每个应用中都去写一遍?这样就会造成代码的冗余,混乱,各个应用中的风格不统一,最后导致整个系统整合后风格各异,那么为了解决这种情况,用一个小的异步工具类举例说明一下,一个懂了,以后所有的用的时候也差不多,都懂了:
首先在interfaces包下定义一个接口:
public interface downinterfaces {
public void show();
}
这个show();中就可以根据你的个人业务去实现需要实现的接口了的方法,或者在进行扩展
然后在uitl包下定义一个下载工具类:
package com.uitl;
import com.downinterfaces;
import android.os.AsyncTask;
public class download extends AsyncTask<String, String, String>{
public downinterfaces downinterfaces;
public download(downinterfaces downinterfaces) {
// TODO Auto-generated constructor stub
this.downinterfaces=downinterfaces;
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
String url=params[0];
/**
* 下载操作
*/
String image="";//下载后得到的东西
return image;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
downinterfaces.show();
}
}
这个是一个很常见的下载异步类,构造方法中去得到使用者传来的downinterfaces,我们大多的下载都差不多,doInBackground中的请求网络大同小异,但不能是做项目的时候项目组中所有的人都去写一下这个类,那么可能的结果就是个个人用的请求的方法不一样,可能是HttpClient,HttpConnection,用的框架不一样,那个进度条也是五花八门,最后整合一个系统的时候问题就大了,就像我们见过的米ui他不可他的米聊中采用一种方法访问网络,自定义一种进度条,咨询中有时一种访问方式,在自定义一种进度条,这样感觉这个系统就怪怪的了,风格不一;这样,我们这里在onPostExecute中打算实现接口downinterfaces中的show()方法,自己定义自己界面中的要显示的东西;
再看调用的时候在activity中:
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new download(new downinterfaces()).execute("url");
}
public class downinterfaces implements com.downinterfaces{
@Override
public void show() {
// TODO Auto-generated method stub
/**
* 各个程序自定义
*/
}
}
}
这里我们每次使用的时候就需要实现downinterface这个接口中的show()方法,那么这样在各个应用中我们传入相应的url,ui自定义那么基本所有的应用都可以用这个,扩展性一下子提高了,不用没人开发者都去写这个异步类,以此类推,接口的使用的地方就可以找到了,特别是在一下大型项目中接口的优势显的尤为重要
接口和抽象类的对比:接口和抽象类差不多,也有一些区别,首先实现接口的类必须都实现接口中的方法,而抽象类不是这样的,比较自由,让子类强制执行的可以定义成抽象方法,不执行的可以在父类中定义执行方法,这里抽象类感觉更好,更容易扩展;其次抽象类只能单继承,而一个类可以实现多个接口,此时感觉接口更胜一筹;于是就有了一个缺省适配模式
例子:找了段代码解释一下,免得忘了
/**
* 接口A<br>
* 这个接口有5个方法,f1~f5
*
* @author 88250
* @version 1.0.0, 2007-8-31
*/
public interface InterfaceA
{
public void f1();
public void f2();
public void f3();
public void f4();
public void f5();
}
/**
* 缺省的适配器角色<br>
* 这个抽象类为<code>InterfaceA</code>提供了默认实现
*
* @author 88250
* @version 1.0.0, 2007-8-31
*/
public abstract class AdapterC implements InterfaceA
{
@Override
public void f1()
{
// TODO Auto-generated method stub
}
@Override
public void f2()
{
// TODO Auto-generated method stub
}
@Override
public void f3()
{
// TODO Auto-generated method stub
}
@Override
public void f4()
{
// TODO Auto-generated method stub
}
@Override
public void f5()
{
// TODO Auto-generated method stub
}
}
/**
* 继承于<code>AdapterC</code>,并覆写了f1()
*
* @author 88250
* @version 1.0.0, 2007-8-31
*/
public class ClassB extends AdapterC
{
@Override
public void f1()
{
// 覆写实现
}
}