<source id="4vppl"><ins id="4vppl"></ins></source>
<u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
<object id="4vppl"></object>
  • <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

    <object id="4vppl"></object>
    <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

      <i id="4vppl"><thead id="4vppl"></thead></i>

      <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>

      當(dāng)前位置:首頁(yè) > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計(jì)軟件教程 > 插件開(kāi)發(fā)中的IAdaptable另一種用法

      插件開(kāi)發(fā)中的IAdaptable另一種用法
      2010-01-14 22:55:16  作者:  來(lái)源:

      IAdaptable是Eclipse插件開(kāi)發(fā)中非常重要的一個(gè)接口,在整個(gè)插件體系中也起著舉足輕重的作用。網(wǎng)上也有不少文章來(lái)介紹這個(gè)接口的用法,因?yàn)槲覜](méi)有碰到那些文章中提到的一些IAdaptable應(yīng)用場(chǎng)景,所以開(kāi)始的時(shí)候?qū)@個(gè)接口不以為然:不就是一個(gè)適配器嗎?有那么重要嗎?隨著項(xiàng)目的進(jìn)展,IAdaptable終于讓我體會(huì)了它的好處。


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

      而不同的組件層次可能需要不同的信息,為了降低耦合度,我開(kāi)始定義和使用各種需要的資源內(nèi)容的提供接口,比如IProjectProvider, IModelProiver, IConfigProvider,ISelectionProvider等等,這樣最外層實(shí)現(xiàn)了一堆Provider,然后根據(jù)不同的需要往內(nèi)層傳,從外層到最終需要該資源的層之間不斷的傳遞,而中間起傳遞作用的各個(gè)層次都來(lái)實(shí)現(xiàn)這些IXxxxProvider接口。開(kāi)始一兩個(gè)還無(wú)所謂,后來(lái)需要傳遞的資源多了,層次多了,維護(hù)非常麻煩(如果增加一種需要的資源,就定義一個(gè)IXxxxProvider)。于是開(kāi)始尋找更好的方法來(lái)處理這種維護(hù)上的麻煩,一次偶然的機(jī)會(huì)在EMF generate的代碼中發(fā)現(xiàn)了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合成一個(gè)呢?對(duì),這樣中間的各個(gè)層次之間只需要實(shí)現(xiàn)IAdaptable接口就可以了,如果發(fā)生變化,只需要修改兩頭:即資源提供者和資源消費(fèi)者,于是我的最外層定義了一個(gè)長(zhǎng)長(zhǎng)的IAdaptable的實(shí)現(xiàn)方法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.     }  

       

      如果這個(gè)數(shù)據(jù)模型是獨(dú)一無(wú)二的,就直接根據(jù)模型類(lèi)型返回模型,如果一個(gè)Provider可能會(huì)提供多個(gè)模型或者一種模型類(lèi)型對(duì)應(yīng)多個(gè)Provider那么就返回Provider,讓模型消費(fèi)者決定來(lái)獲取哪個(gè)模型。
      雖然重構(gòu)為使用IAdaptable花了不少時(shí)間,但是對(duì)于后期的變動(dòng)卻少了不少的麻煩,而且代碼也減肥了不少。


      安徽新華電腦學(xué)校專(zhuān)業(yè)職業(yè)規(guī)劃師為你提供更多幫助【在線咨詢
      国产午夜福三级在线播放_亚洲精品成a人片在线观看_亚洲自慰一区二区三区_久久棈精品久久久久久噜噜
      <source id="4vppl"><ins id="4vppl"></ins></source>
      <u id="4vppl"><sub id="4vppl"><label id="4vppl"></label></sub></u>
      <object id="4vppl"></object>
    1. <u id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></u>

      <object id="4vppl"></object>
      <b id="4vppl"><sub id="4vppl"><tr id="4vppl"></tr></sub></b>

        <i id="4vppl"><thead id="4vppl"></thead></i>

        <thead id="4vppl"><li id="4vppl"><label id="4vppl"></label></li></thead>
        亚洲欧美国产va在线播放 | 尤物视频在线国自产视频 | 最新亚洲中文字幕 | 亚洲中文字视频 | 亚洲性夜夜综合久久9 | 亚洲日韩国产一区二区三区 |