<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)前位置:首頁 > 網(wǎng)站舊欄目 > 學(xué)習(xí)園地 > 設(shè)計軟件教程 > 插件開發(fā)中的IAdaptable另一種用法

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

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


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

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

       

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


      安徽新華電腦學(xué)校專業(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>
        亚洲免费人成在线视频观看 | 日本中文字幕在线视频二区 | 在线观看亚洲中文AV | 天色综合久久久久久久噜噜 | 日韩精品久久久久久福利 | 偷偷久久久久久网站 |