天天看點

Eclipse的Adapter機制

oF的Adapter解決了将一種接口适配為另一種接口的方法,例如:

将實作了接口A的AImpl适配為接口B,就需要從AImpl繼承,同時實作B接口:

class BImpl extends AImpl implements B { ... }

但是在Eclipse中要将一個Object适配為另外的接口,很可能有很多個,并且在将來還可能需要增加新的接口,而用戶端需要動态将該Object适配為自己想要的類型

例 如,自己的一個對象MyObject需要适配為IFile對象,如果直接使用Adapter接口,就需要實作IFile接口,這是非常困難的,是以 Eclipse設計了一種Adapter機制,通過實作IAdaptable接口,就能動态查詢一個Object是否支援某個接口,如果支援,就将其轉化 為該接口的對象

例子:

我們自己設計的MyObject包含一個IFile引用:

class MyObject {

    private IFile file;

}

若要将MyObject動态轉化為IFile,就需要實作IAdaptable接口:

class MyObject implements IAdaptable {

    private IFile file;

    public Object getAdapter(Class adapter) {

        if(adapter.equals(IFile.class))

            return file;

        return null;

    }

}

用戶端希望将MyObject轉型為IFile時,就通過getAdapter方法檢測是否能将MyObject轉型為IFile:

MyObject obj = ...;

if(obj instanceof IAdaptable) {

    IFile file = (IFile) ((IAdaptable)obj).getAdapter(IFile.class);

    if(file!=null) {

        // got the file!

    }

}

好處:

用戶端可以動态查詢一個Object是否支援某個接口

自己的Object不需要通過繼承來實作Adapter,因為需要适配的接口越多,類就會越來越複雜

擴充極其容易,例如,一個新的用戶端需要InputStream而非IFile,就隻需要修改getAdapter()方法:

    public Object getAdapter(Class adapter) {

        if(adapter.equals(IFile.class))

            return file;

        if(adapter.equals(InputStream.class))

            return file.getInputStream();

        return null;

    }

原來的用戶端不受影響,新的用戶端也能正常工作。

有 了Adapter機制,就能動态查詢任何一個Object能否轉型為某一接口。在Eclipse中,許多Object并非IResource類型,但是右 鍵菜單都能列出Copy, Paste, CVS等操作,就是因為他們實作了IAdaptable接口并有能力轉化為IResource

額 外的好處:擴充代碼與原代碼無關,例如Java開發環境的一個Objec可能是IJavaClass對象,擴充對象(例如一個右鍵菜單Action)不會 引用IJavaClass,而是引用IResource,元件之間沒有耦合。Action隻需要告訴Eclipse它需要一個IResource, Eclipse就去查詢IJavaClass對象并試圖将其轉化為IResource,若轉化成功,該Action就可以出現在右鍵菜單上。

下次再繼續寫Eclipse的AdapterFactory

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1583641

繼續閱讀