文章目录

 IAdaptableEclipse里是一个非常重要的接口。

乍看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;

}

   …….

}

    大家可以看到当clazzList的时候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);

}

可以看到它是调用了AdapterManagergetAdapter来实现转换

再看AdapterManagergetAdapter的源码:

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.

文章目录