學習了What is IAdaptable?這篇文章,有點困惑,干脆做個demo鞏固下,包括三個部分:OldObject 、NewObject和工廠類YearFactory
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
// 實現了IAdaptable 接口 public class OldObject implements IAdaptable { private String yearmonthday; public String getYearmonthday() { return yearmonthday; } public void setYearmonthday(String yearmonthday) { this.yearmonthday = yearmonthday; } public Object getAdapter(Class adapter) { return Platform.getAdapterManager().getAdapter(this, adapter); } }
public class NewObject { private String year; public String getYear() { return year; } public void setYear(String year) { this.year = year; } }
完成具體的轉換
import org.eclipse.core.runtime.IAdapterFactory; public class YearFactory implements IAdapterFactory { private static final Class[] types = { NewObject.class }; public Object getAdapter(Object old, Class clazz) { if (clazz == NewObject.class && old instanceof OldObject) { NewObject objectNew= new NewObject(); objectNew.setYear(((OldObject) old).getYearmonthday().substring(2)); //隨意的規則 return objectNew; } else { return null; } } public Class[] getAdapterList() { return types; } }
調用轉換的代碼:
Platform.getAdapterManager().registerAdapters(new YearFactory(), OldObject.class); OldObject old = new OldObject(); old.setYearmonthday("20070914");Object adaptable = old.getAdapter(NewObject.class); if (adaptable != null) {NewObject node = (NewObject) adaptable;System.out.println(node.getYear());}
總結:
術語:源對象、轉換類型、工廠
目的:實現兩個不相關對象的轉換
(1)源對象需要實現IAdaptable接口,或者繼承PlatformObject抽象類
(2)在源對象IAdaptable接口方法getAdapter的實現可以如下,即直接轉發給AdapterManager的getAdapter()方法
public Object getAdapter(Class adapter) {return Platform.getAdapterManager().getAdapter(this, adapter);}
(3)實現轉換工廠類,具體負責轉換,需要實現IAdapterFactory接口,其接口方法getAdapterList()負責通知AdapterManager轉換類型,
而getAdapter方法具體完成轉換
(4)將轉換工廠類注冊到AdapterManager:
Platform.getAdapterManager().registerAdapters(new YearFactory(), OldObject.class);
這樣的好處在于,如果源對象需要轉換到多個不相關的對象的時候,不需要修改源對象,而直接轉發給相應的工廠類,這樣在一定程度上保護了源對象免于修改,
而是修改或者增加新的工廠類。