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.