android Java 面向對象編程之 interface

    interface 是Java實現多態的一種方式(其他的還有繼承,重寫等等),Java不允許多繼承(一個類繼承多個類),但是可以實現多個接口。

    在項目開發中我們一般什麼情況下才會用到interface呢?設計模式中有種比較常用的設計模式,叫做構造者模式,通常情況下我們實現的功能只需要在一個類中的方法就可以直接實現,但是我們不可能把所有的方法都放到同一個類中,我們需要把不同的實現功能放在不同的類中看如下本人寫的一個簡單的圖片內存緩存,裏面定義了一個interface用法看代碼中的註釋

public class MyImageLoader {

// public static Map<String, SoftReference<Drawable>> mDrawableCache = new
// HashMap<String, SoftReference<Drawable>>();
public static LruCache<String, Drawable> mDrawableCache = new LruCache<String, Drawable>(
1024 * 1024);
private ExecutorService executorService = Executors.newCachedThreadPool();
// private ExecutorService executorService =
// Executors.newFixedThreadPool(5);
private Handler handler = new Handler();


public Drawable loadDrawable(final String imgUrl,
final OnLoadImageListener mImageListener) {
if (mDrawableCache.get(imgUrl) != null) {
Log.e("cahe", "ok");
return mDrawableCache.get(imgUrl);


} else {
Log.e("cahe", "not ok");
executorService.submit(new Runnable() {
public void run() {
try {
final Drawable drawable = Drawable.createFromStream(
new URL(imgUrl).openStream(), "image.png");
mDrawableCache.put(imgUrl, drawable);
// SystemClock.sleep(2000);
handler.post(new Runnable() {
public void run() {

                                                                /*回調這個接口,不要想得太複雜,太高級,就是使用這個接口中的方法,但是剛剛在那個接口                                                                   上你沒有看到這個方法裏面有任何東西啊,別急,這個方法的內容在另一個類中實現了,請看

                                                                  下面的MainActivity.class*/
mImageListener.onloadImage(drawable);
}
});
Log.e("cacheSize", String.valueOf(getCacheSize()));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
});
}
return null;
}


public static int getCacheSize() {
if (mDrawableCache != null) {
return mDrawableCache.size();
}
return 0;
}


       //定義一個接口,並在 上面 loadDrawable這個方法中使用這個接口,用法請看 loadDrawable這個方法的內容
interface OnLoadImageListener {

                /*這個方法很重要,定義接口就是爲了使用這個方法,但是這是這個公共的抽象方法,無法再接口中實現,

                  必須在一個類(下面的MainActivity.class)中使用implement這個關鍵字來實現這個接口,實現這個接口時可以在這個方法中做一些你想要的操作,詳                    細情況請看下面的接口實現

                */

public void onloadImage(Drawable drawable);
}
}


class MainActivity extends Activity  implements OnLoadImageListener{

       ImageView img;

       MyImageLoader myImageLoader;//上面寫的那個MyImageLoader類;

      String url //圖片的地址

       @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

                img = (ImageView)findViewById(R.id.img);

                myImageLoader = new MyImageLoader();
myImageLoader.loadDrawable(url, this);//使用this是因爲這個MainActivity類本身實現了這個接口,因此也代表                                                                                                                了 OnLoadImageListener這個接口,只不過他把接口的方法實現了而已,看下面

         }

           

           //接口的那個方法會在這裏得到實現

          @Override
  public void onloadImage(Drawable drawable) {
// TODO Auto-generated method stub

                        //drawable 在MyImageLoader類的loadDrawable這個方法中已經可以獲取,從而就可以在這裏更新UI了
img.setImageDrawable(drawable);
  }

}


對於Java基礎比較一般的同學這個看起來應該會有點費力,但是學習Java的面向對象就必須懂得這個(其實也很簡單)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章