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