我的RCP之旅(二) -- IAdaptable
IAdaptable在Eclipse里是一个非常重要的接口。
乍看IAdaptable是不是想到了Adapter模式..恩~~,他们的作用的确是差不多的.. IAdaptable也算是对Adapter模式的一种扩展.不过比之普通的Adapter模式, IAdaptable显得是那么的强大…
Adapter模式是能够将没有接口的实现,通过Adapter这个接口来体现出来.说白了这个实现还是存在的.而IAdaptable做的不是添加接口来体现实现,他甚至可以将整个接口都改变.在数据保留的情况下将实现都改变,或者添加新的实现.所以IAdaptable做的最多的是类型的转换.而且最主要的是这一切都可以是动态的.
下面来看看IAdaptable是怎么运作的
1. 单单使用IAdaptable接口(静态的)
a) 普通的类型转换:
Object o = new ArrayList();
List list = (List)o;
这种转换还是比较常见的.那我看来看看用IAdaptable是怎么转换的
b) 通过IAdaptable进行类型转换
IAdaptable adaptable = new ArrayList();
//注:这里的ArrayList不是指 java.util.ArrayList 而是实现了IAdaptable接口的一个ArrayList
List list = (List)adaptable.getAdapter(java.util.List.class);
这就是上面所说的动态类型转换,我们所做的事情是试图把 adaptable转换为一个 List实例。大家一定会想这不是对此一举么.但是如果我们想把一个HashMap通过IAdaptable转换成一个List.这个时候IAdaptable的威力就体现出来了.如下:
IAdaptable adaptable = new HashMap();
//注:这里的HashMap不是指 java.util. HashMap而是实现了IAdaptable接口的一个HashMap
List list = (List)adaptable.getAdapter(java.util.List.class);
我们来看看这个getAdapter是怎么实现的:
public class HashMap implements IAdaptable {
public Object getAdapter(Class clazz) {
if (clazz == java.util.List.class) {
List list = new ArrayList(this.size());
list.addAll(this.values());
return list;
}
return null;
}
…….
}
大家可以看到当clazz是List的时候getAdapter就会将HashMap转化为List如果还想将HashMap转为其他类型的话.只要再加一个if(){}就可以了,但是大家一定也觉得如果要增加一种转换类型就需要直接修改HashMap的源码并重新编译.这样做好像并不符合Eclipse的风格,所以Eclipse将他进一步抽象,提供了一个PlatformObject抽象类并通过AdapterManager来管理各种adapter.这样大家可以通过配置文件动态的添加adapter来动态的对一个类添加功能..大家往下看
2. 通过IAdapterManager管理Adapter(动态的)
要通过IAdapterManager来管理Adapter,那需要转换的对象就要继承PlatformObject, PlatformObject里已经实现了getAdapter:
public Object getAdapter(Class adapter) {
return AdapterManager.getDefault().getAdapter(this, adapter);
}
可以看到它是调用了AdapterManager的getAdapter来实现转换
再看AdapterManager的getAdapter的源码:
public Object getAdapter(Object adaptable, Class adapterType) {
IAdapterFactory factory = (IAdapterFactory) getFactories(adaptable.getClass()).get(adapterType.getName());
Object result = null;
if (factory != null)
result = factory.getAdapter(adaptable, adapterType);
if (result == null && adapterType.isInstance(adaptable))
return adaptable;
return result;
}
可以看到它是将具体的转换实现封装在IAdapterFactory中,通过IAdapterFactory. getAdapter来实现转换.那具体的IAdapterFactory就得大家自己来实现了.
记得还要将这个IAdapterFactory注册到platform上如下:
Platform.getAdapterManager().registerAdapters(
new NodeListFactory(), List.class
);
(NodeListFactory就是具体封装实现的那个IAdapterFactory)
,不然AdapterManager可不知道要去调那个IAdapterFactory.