Eclipse的Adapter机制

oF的Adapter解决了将一种接口适配为另一种接口的方法,例如:
将实现了接口A的AImpl适配为接口B,就需要从AImpl继承,同时实现B接口:
class BImpl extends AImpl implements B { ... }

但是在Eclipse中要将一个Object适配为另外的接口,很可能有很多个,并且在将来还可能需要增加新的接口,而客户端需要动态将该Object适配为自己想要的类型

例 如,自己的一个对象MyObject需要适配为IFile对象,如果直接使用Adapter接口,就需要实现IFile接口,这是非常困难的,因此 Eclipse设计了一种Adapter机制,通过实现IAdaptable接口,就能动态查询一个Object是否支持某个接口,如果支持,就将其转化 为该接口的对象

例子:
我们自己设计的MyObject包含一个IFile引用:
class MyObject {
    private IFile file;
}

若要将MyObject动态转化为IFile,就需要实现IAdaptable接口:
class MyObject implements IAdaptable {
    private IFile file;

    public Object getAdapter(Class adapter) {
        if(adapter.equals(IFile.class))
            return file;
        return null;
    }
}

客户端希望将MyObject转型为IFile时,就通过getAdapter方法检测是否能将MyObject转型为IFile:
MyObject obj = ...;
if(obj instanceof IAdaptable) {
    IFile file = (IFile) ((IAdaptable)obj).getAdapter(IFile.class);
    if(file!=null) {
        // got the file!
    }
}

好处:
客户端可以动态查询一个Object是否支持某个接口
自己的Object不需要通过继承来实现Adapter,因为需要适配的接口越多,类就会越来越复杂
扩展极其容易,例如,一个新的客户端需要InputStream而非IFile,就只需要修改getAdapter()方法:
    public Object getAdapter(Class adapter) {
        if(adapter.equals(IFile.class))
            return file;
        if(adapter.equals(InputStream.class))
            return file.getInputStream();
        return null;
    }

原来的客户端不受影响,新的客户端也能正常工作。

有 了Adapter机制,就能动态查询任何一个Object能否转型为某一接口。在Eclipse中,许多Object并非IResource类型,但是右 键菜单都能列出Copy, Paste, CVS等操作,就是因为他们实现了IAdaptable接口并有能力转化为IResource

额 外的好处:扩展代码与原代码无关,例如Java开发环境的一个Objec可能是IJavaClass对象,扩展对象(例如一个右键菜单Action)不会 引用IJavaClass,而是引用IResource,组件之间没有耦合。Action只需要告诉Eclipse它需要一个IResource, Eclipse就去查询IJavaClass对象并试图将其转化为IResource,若转化成功,该Action就可以出现在右键菜单上。

下次再继续写Eclipse的AdapterFactory


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1583641

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值