學(xué)習(xí)了What is IAdaptable?這篇文章,有點(diǎn)困惑,干脆做個(gè)demo鞏固下,包括三個(gè)部分:OldObject 、NewObject和工廠類YearFactory
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.Platform;
// 實(shí)現(xiàn)了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;
}
}
完成具體的轉(zhuǎn)換
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)); //隨意的規(guī)則
return objectNew;
} else {
return null;
}
}
public Class[] getAdapterList() {
return types;
}
}
調(diào)用轉(zhuǎn)換的代碼:
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());
}
總結(jié):
術(shù)語(yǔ):源對(duì)象、轉(zhuǎn)換類型、工廠
目的:實(shí)現(xiàn)兩個(gè)不相關(guān)對(duì)象的轉(zhuǎn)換
(1)源對(duì)象需要實(shí)現(xiàn)IAdaptable接口,或者繼承PlatformObject抽象類
(2)在源對(duì)象IAdaptable接口方法getAdapter的實(shí)現(xiàn)可以如下,即直接轉(zhuǎn)發(fā)給AdapterManager的getAdapter()方法
public Object getAdapter(Class adapter) {
return Platform.getAdapterManager().getAdapter(this, adapter);
}
(3)實(shí)現(xiàn)轉(zhuǎn)換工廠類,具體負(fù)責(zé)轉(zhuǎn)換,需要實(shí)現(xiàn)IAdapterFactory接口,其接口方法getAdapterList()負(fù)責(zé)通知AdapterManager轉(zhuǎn)換類型,
而getAdapter方法具體完成轉(zhuǎn)換
(4)將轉(zhuǎn)換工廠類注冊(cè)到AdapterManager:
Platform.getAdapterManager().registerAdapters(new YearFactory(), OldObject.class);
這樣的好處在于,如果源對(duì)象需要轉(zhuǎn)換到多個(gè)不相關(guān)的對(duì)象的時(shí)候,不需要修改源對(duì)象,而直接轉(zhuǎn)發(fā)給相應(yīng)的工廠類,這樣在一定程度上保護(hù)了源對(duì)象免于修改,
而是修改或者增加新的工廠類。