安徽新华电脑专修学院_安徽电脑培训_安徽电脑培训学校_合肥电脑培训

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > 插件開發中的IAdaptable另一種用法

插件開發中的IAdaptable另一種用法
2010-01-14 22:55:16  作者:  來源:

IAdaptable是Eclipse插件開發中非常重要的一個接口,在整個插件體系中也起著舉足輕重的作用。網上也有不少文章來介紹這個接口的用法,因為我沒有碰到那些文章中提到的一些IAdaptable應用場景,所以開始的時候對這個接口不以為然:不就是一個適配器嗎?有那么重要嗎?隨著項目的進展,IAdaptable終于讓我體會了它的好處。


先來介紹一下我的項目情況:我的項目是一個開發工具插件,其核心就是各種xml配置文件的編輯器。編輯器的組件體系比較復雜,就像芭比娃娃,一成套一層的,比如多頁編輯器中套單頁編輯器,單頁編輯器中根據不同的內容又分成不同的區塊,區塊還包含最終的編輯元素,比如text, combobox等等。而要編輯的內容模型內容以及相關的資源信息(比如IProject, IFile, IPath)大部分都位于組件結構的最外層,比如IEditorPart, IEditInput中。

而不同的組件層次可能需要不同的信息,為了降低耦合度,我開始定義和使用各種需要的資源內容的提供接口,比如IProjectProvider, IModelProiver, IConfigProvider,ISelectionProvider等等,這樣最外層實現了一堆Provider,然后根據不同的需要往內層傳,從外層到最終需要該資源的層之間不斷的傳遞,而中間起傳遞作用的各個層次都來實現這些IXxxxProvider接口。開始一兩個還無所謂,后來需要傳遞的資源多了,層次多了,維護非常麻煩(如果增加一種需要的資源,就定義一個IXxxxProvider)。于是開始尋找更好的方法來處理這種維護上的麻煩,一次偶然的機會在EMF generate的代碼中發現了IAdaptable接口的用法:

java 代碼
 
  1. public Object getAdapter(Class key) {   
  2.     if (key.equals(IContentOutlinePage.class)) {   
  3.         return showOutlineView() ? getContentOutlinePage() : null;   
  4.     }   
  5.     else if (key.equals(IPropertySheetPage.class)) {   
  6.         return getPropertySheetPage();   
  7.     }   
  8.     else if (key.equals(IGotoMarker.class)) {   
  9.         return this;   
  10.     }   
  11.     else {   
  12.         return super.getAdapter(key);   
  13.     }   
  14. }  

 

能不能將所有Provider合成一個呢?對,這樣中間的各個層次之間只需要實現IAdaptable接口就可以了,如果發生變化,只需要修改兩頭:即資源提供者和資源消費者,于是我的最外層定義了一個長長的IAdaptable的實現方法getAdaptable():

java 代碼
 
  1. public Object getAdapter(Class key) {   
  2.         if (key.equals(IContentOutlinePage.class)) {   
  3.             return showOutlineView() ? getContentOutlinePage() : null;   
  4.         }   
  5.         if (key.equals(IPropertySheetPage.class)) {   
  6.             return getPropertySheetPage();   
  7.         }   
  8.   
  9.         if (key.equals(IGotoMarker.class)   
  10.                 || key == IEditingDomainProvider.class  
  11.                 || key == ISelectionProvider.class  
  12.                 || key == IClipboardProvider.class  
  13.                 || key == IAdapterFactoryProvider.class) {   
  14.             return this;   
  15.         }   
  16.   
  17.         if (IProject.class.equals(key)) {   
  18.             return getProject();   
  19.         }   
  20.   
  21.         if (BaseConfig.class.equals(key)) {   
  22.             return ((IConfigProvider) this).getConfig();   
  23.         }   
  24.   
  25.         if (EObject.class.equals(key)) {   
  26.             return getModel();   
  27.         }   
  28.   
  29.         if (DoradoXMLResourceImpl.class.equals(key)) {   
  30.             return ((IResourceProvider) this).getResource();   
  31.         }   
  32.   
  33.         if (key == EditingDomain.class) {   
  34.             return editingDomain;   
  35.         }   
  36.   
  37.         if (key == AdapterFactory.class) {   
  38.             return adapterFactory;   
  39.         }   
  40.   
  41.         if (key == BaseActionBarContributor.class) {   
  42.             return getActionBarContributor();   
  43.         }   
  44.   
  45.         if (key == Clipboard.class) {   
  46.             return getGlobalClipboard();   
  47.         }   
  48.   
  49.         return super.getAdapter(key);   
  50.     }  

 

如果這個數據模型是獨一無二的,就直接根據模型類型返回模型,如果一個Provider可能會提供多個模型或者一種模型類型對應多個Provider那么就返回Provider,讓模型消費者決定來獲取哪個模型。
雖然重構為使用IAdaptable花了不少時間,但是對于后期的變動卻少了不少的麻煩,而且代碼也減肥了不少。


安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
主站蜘蛛池模板: 伸缩机厂家-现货快递物流伸缩皮带机|装车输送机-乐清市华森自动化设备有限公司 | 智能试剂柜-疾控|高校实验室|医院药品智能试剂管理柜-北京晶品赛思 | 现代卓越官网-专注于pmp培训证书-pmp考试报名时间-pmp认证-项目管理pmp-ACP敏捷管理-NPDP认证 | 膜结构车棚厂家-张拉膜景观棚-汽车充电桩停车棚-嘉兴铭邦膜结构公司 | 思达测试|山东思达高科机械设备有限公司 | 物流系统?货代系统?国际快递/专线/小包系统首选?哲盟软件 | 商标注册_商标转让交易_专利申请_版权登记_ISO认证服务咨询-世标知识产权 | 网上配音_免费配音_广告专题配音_网络录音网站【海豚配音】 | 生物除臭塔_生物除臭箱_玻璃钢吸收塔_玻璃钢集气罩_-安丘恒业玻璃钢有限公司 | 上海眸社设计-上海专业的VI设计,宣传册设计,画册设计,折页设计公司 | 专业的展会信息服务平台 - 展加 专题秀_汇聚网络热门专题_实时报道各类新闻专题资讯 | 誉瑞仪器是全球知名检测仪器厂商RAE在华东地区的专业级产品销售及授权维修服务商- | 通风方式信号控制箱_人防呼叫按钮_人防设备厂家–西安鼎兴自控工程有限公司 | 长沙市富巴机电设备有限公司-长期销售施能,霍尼韦尔,霍科德,意莱克斯,台仪,泛达 | 牡丹江网络公司,牡丹江网站建设专家|网络推广|网络营销|黑龙江艺通网络技术开发有限公司 | 江苏科星新材料有限公司 - 南通科星化工股份有限公司 - 南通星奇新材料有限公司 | 久久91精品久久91综合_国产亚洲自拍一区_国产精品第1页_亚洲高清视频一区_91成人午夜在线精品_亚洲国产精品网站在线播放_亚洲国产成人久久综合区_国产精品亚洲专区在线观看_免费视频精品一区二区三区 | 优质课网_收录全国及各省市最新优质课视频,说课视频,名师课例课堂实录,高效课堂教学视频,观摩展示公开示范优秀课视频,教学大赛视频! | 上海网站建设-上海网站制作-网站设计-上海做网站公司-SEO优化推广-咏熠软件 | 同步分流马达_液压泵维修_派克多路阀-济南富诚液压设备有限公司 通用变频器|国产变频器|深圳变频器厂家-深圳市英捷思技术有限公司 | 长沙广告设计公司|长沙广告制作|湖南户外广告制作|商业美陈就找湖南盛翔文化传媒有限公司老品牌高品质 | 吸附式干燥机|零气耗压缩热干燥机|无锡气净法工业技术有限公司【官网】 | 商标注册_商标转让交易_专利申请_版权登记_ISO认证服务咨询-世标知识产权 | 主营:回收各类废旧物资,上海巨合物资回收有限公司官方网站 | 离婚协议书怎么写_离婚协议书模板标准版_离婚协议书范本下载 - 离婚协议书 | 南京包装设计公司|南京手提袋制作|彩页印刷|礼品盒设计 | 南洋电线电缆|中压交联电缆|高压电力电缆-NAN南洋电缆 | 企业资质代办-代理全国工商注册公司_公司转让_增值电信业务许可证新办续期-大通天成科技[gw] | 浏阳企业网站建设|设计|制作,专业做网站,建站公司-冠讯网络公司 领先的一站式_专利申请代理知识产权服务平台_乐知网 | 水分测定仪_微量水分测定仪_高低温试验箱_昆山鹭工精密仪器有限公司 | 锁螺丝机_自动螺丝机_手持式自动锁螺丝机_自动打螺丝机-普思自动化 | 武晋工程_江苏武晋工程咨询有限公司| 漫画大全免费看_漫画终身版_羞羞漫画网 | 郑州润滑油展-第16届中国润滑油、脂及汽车养护展览会-2025年5月27-28日-郑州国际会展中心 | 亚澳农机-亚澳南阳农机股份公司,旋耕机,旋播机,旋播施肥机,免耕播种机,旋耕播草多用机,果园机械-首页 | 山西华盛筑景装饰,山西专业公装公司,太原公装装修公司,包括:办公室,酒店宾馆,商铺店铺,学校幼儿园,会所会馆饭店餐馆等装修设计 | 久久黄色一级视频_视频一区精品自拍_理论片免费ā片在线观看_亚洲色视频在线播放网站_香港经典a毛片免费观看_亚州三级久久电影 | 投影仪配件,苏州投影仪维修,B60数显表维修-苏州市加野仪器有限公司 | 山东长青石油液压机械有限公司-致力于石油机械设备的研发制造,提供定制服务 | 气动球阀,电动蝶阀,调节阀,衬氟阀门,水利控制阀,大口径阀门生产厂家-上海百钢阀门集团有限公司-官网,上海阀门品牌 | 碎料机_拌料机_吸料机_温控箱_烤料斗_模温机_东莞索亿塑料破碎机厂家 |