`

Eclipse中类型扩展机制分析

 
阅读更多

1.标准的适配器模式

适配器模式:把一个类的接口变换为客户端所期望的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

 

为了便于下面的讨论,我们延用设计模式书籍中使用的三个角色:

Adaptee(源,待适配):需要适配的类型,行为需要被复用

Target(目标):适配的方向,也就是我们期待的接口,客户端定义的契约

Adapter(适配器):承担类型匹配任务的具体类,Target类型实现类

Adapter是需要实例化使用的,所以是具体类,而Target代表目标类型的抽象

 

类适配器模式:适配器Adapter同时继承了目标类型Target和源Adaptee

缺点:如果源Adaptee有一系列类型(有共同的顶级父类型),那我们需要对这一系列类型中的每个类型(源及其子类型)都产生一个适配器类实现,也就是说,会引入大量的类型,带来类型膨胀的问题。

对象适配器模式:适配器Adapter继承了目标类型Target,组合了源Adaptee

缺点:无法定制Adaptee的行为

 

声明一个适配器接口,所以实现此接口的类都具备适配能力:

 

publicinterface IAdaptable {

               public Object getAdapter(Class adapter);

}

 获取适配类型:

 

 if (source instanceof IAdaptable) {
            IAdaptable adaptable = ((IAdaptable)source);
            Object instance = adaptable.getAdapter(Interface2.class);
            if (instance != null)
               ((Interface2) instance).operation();
        }

 这样子仅仅能够使用别人提供好的适配类型,而无法做到自己扩展适配类型

 

AdapterManager.getAdapter(this, adapter)

 如果存在这样一个适配管理者,把所以的适配类型都管理起来,我们就可以很容易的自己扩展类型了

 

 

 

2.eclipse中的类型扩展机制

 Eclipse平台本身是一个微内核micro kernel)加核心插件(core plug-ins)的结构,微内核是指EcllipseOSGI实现Equinox(当然包含了扩展点机制的支持),这里的核心插件就是指:runtimeresourceworkbench而这里的平台运行时为我们提供的主要的特性是:类型扩展支持(IAdaptableIAdapterFactoryIAdapterManager)和线程支持(JobISchedulingRule)。我们今天要讨论的就是类型扩展支持。

 

org.eclipse.core.runtime.IAdaptable:用来声明特定类型是否是可以被适配的并提供了默认适配器类org.eclipse.core.runtime.PlatformObjectEclipse中,只要是继承自以上接口或者抽象类的类型,就被视为“可扩展类型”。

org.eclipse.core.runtime.IAdapterFactory:用可以将自定义的适配逻辑放入IadapterFactory

org.eclipse.core.runtime.IAdapterManager:可以将自定义的适配逻辑实例注册到IadapterManager中。注册的方式有两种,通过代码静态注册:IAdapterFactory.registerAdapters(IAdapterFactory factory, Class adaptable)和通过实现org.eclipse.core.runtime.adapters扩展点注册。

IadapterManager提供了两种getAdapterloadAdapter两种接口,如果是使用扩展的方式添加的类型,getAdapter的方式不会去强制启动你的插件,而loadAdapter的方式会去强制启动你的插件。如果是以代码的方式注册的,那也直接取决于所在插件是否启动。

 

尽管eclipse的类型扩展机制比较灵活,但是凡事都有其缺陷。eclipse在提供灵活的机制的同时,并没有考虑到类型冲突问题,所以在我们使用的时候同时也应该注意管理好类型。

 

 

参考:http://www.blogjava.net/zhuxing/archive/2009/10/13/222860.html

分享到:
评论

相关推荐

    Eclipse_Swt_Jface_核心应用_部分19

    6.6.2 Eclipse中的CBanner 95 6.7 滚动面板(ScrolledComposite) 95 6.7.1 设置滚动条的样式 96 6.7.2 滚动面板的其他方法 97 6.8 本章小结 97 第7章 SWT布局管理器 98 7.1 布局管理器概述 98 7.1.1 ...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    疯狂JAVA讲义

    5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入...

    Python灰帽子-黑客与逆向工程师的Python编程之道[简体中文版]

    逆向工程与漏洞挖掘,并向读者呈现了几乎每个逆向工程师或安全研究人员在日常工作中所面临的各种场景,其中包括:如何设计与构建自己的调试工具,如何自动化实现烦琐的逆向分析任务,如何设计与构建自己的fuzzing...

    php网络开发完全手册

    9.1 PHP中的错误类型 136 9.1.1 语法错误 136 9.1.2 语义错误 137 9.1.3 逻辑错误 137 9.1.4 注释错误 137 9.1.5 运行时的错误 138 9.2 PHP程序调试策略 138 9.2.1 PHP的错误级别 138 9.2.2 打开PHP的错误报告 140 ...

    Android典型技术模块开发详解

    1.2 Eclipse开发环境 1.2.1 安装ADT插件 1.2.2 安装SDK 1.2.3 配置源代码 1.2.4 创建AVD 1.3 Android模拟器 1.3.1 ADB工具 1.3.2 其它常用工具 1.4 本章小结 第2章 应用程序构建 2.1 创建Android工程 2.2 Hello...

    python灰帽子包含高清扫描和可复制两个版本.zip

    构建自己的调试工具,如何自动化实现烦琐的逆向分析任务,如何设计与构建自己的fuzzing工具,如何利用fuzzing测试来找出存在于软件产品中的安全漏洞,一些小技巧诸如钩子与注入技术的应用,以及对一些主流Python安全...

    SeckillDesignImpl:高并发秒杀系统设计与实现

    redis提供了两种持久化方式RDB,AOF,可防止数据丢失高可用(从后期业务扩展角度考虑),redis支持集群功能,可以实现主从复制,读写分离,提供哨兵机制等等详细可参考这篇文章:内容概述对高并发业务场景进行分析,...

    java开源包1

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    精通Qt4编程(第二版)源代码

    较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统和对象树机制,以及部件类型和部件的几何布局等内容。 35 \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包2

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包3

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    精通qt4编程(源代码)

    较深入地分析了Qt对象模型的一些基本知识,涉及信号和槽机制、Qt元对象系统、属性系统和对象树机制,以及部件类型和部件的几何布局等内容。 35 \ 第4章 程序主窗口—— QMainWindow 卢传富 Qt应用程序的主窗口是由多...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包5

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包10

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包4

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics