<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chasing an mobile web vision

    闖蕩在移動互聯網的世界中

    OSGi介紹(七)bundle和service(續)

    接上一篇的例子,為了更具體一點,我們考慮這樣的case,
    假設房地產開發商construction A采納了規劃公司design A的方案,打算建造公寓類型的房子CityApartment
    然后客戶A買了一套房子

    用ooa方式分析這個case,
    我抽象這幾個實體:規劃公司,圖紙類型,開發商,房子,買房人
    然后描述這幾件事情:開發商選擇設計圖紙,蓋樓然后銷售;買房人根據圖紙買房并使用房子

    下面是我用java語言來簡單描述它:

    design A 公司

    package design.a;
    interface Apartment {
    ..
    //方法省略先
    }

     

    開發商construction A

    package construction.a

    import design.a.*;//開發商要按照圖紙蓋樓

    class CityApartment implements Apartment {
    .
    //方法省略先
    }


    class Construction implements BundleActivator{

    }



    客戶 costumer A

    package customer.a

    import design.a.*;//客戶要按照圖紙選擇房子

    class Customer implements BundleActivator {
    .
    //方法省略先
    }



    然后我們把他們分別做成bundle
    Bundle A : design A
    其manifest中這樣描述

    BundleSymbolicName: design A
    Export
    -Package: design.a


    Bundle B : construction A
    其manifest中這樣描述

    BundleSymbolicName: construction A
    Import
    -Package: design.a
    Bundle
    -Activator: construction.a.Construction


    Bundle C : customer C
    其manifest中這樣描述

    BundleSymbolicName: customer C
    Import
    -Package: design.a
    Bundle
    -Activator: customer.c.Customer



    這樣,裝入到framework后,framework就會把BundlB和C與BundleA關聯起來,正好描述開發商A選擇design A的圖紙,客戶A也不得不選擇design A的圖紙啦
    可是,單從這里,我們看不出來,開發商和客戶拿同一份圖紙干什么。那我們得必須在BundleB和C的實現里面寫點東西來說明。

    這里給出開發商construction.a.Construction的偽代碼:

    class Construction implements BundleActivator {

     
    public void start(BundleContext context){
      CityApartment apartment 
    = null;
      Hashtable properties 
    = null;
      
    for(int i = 0; i < 100; i ++){
       properties 
    = new Hashtable();
       properties.put(
    "price",new Integer(1000 + i*5));//開發商為房子定價
       apartment = new CityApartment();//一套房子蓋好
       
    //把房子按照公寓注冊出去并打廣告,等待客戶來購買,framework就相當于一個售樓處兼房屋中介
       context.registerService(Apartment.class.getName()/*公寓類型*/,apartment/*房子作為服務對象*/,properties/*與房子相關的附帶信息*/);
       
      }

      
    //這樣開發商一共注冊一百套房子
     }

    }



    而客戶的代碼可以如下:

    class Customer implements BundleActivator {
     
    public void start(BundleContext context){
      Apartment apartment 
    = null;
      ServiceReference ref 
    = context.getServiceReference(Apartment.class.getName,"(price=1050)");//先簽署購房合同,而且指明選擇Apartment類型,價格為1050的房子。
      apartment = (Apartment)context.getService(ref);//然后買到房子
      
    //買房人就可以使用房子apartment對象進行日常生活了
     }

    }


    這樣,我們就很清楚的看出,Design A為Construction A和Customer A提供了共同的Apartment定義,才使得他們有交易的可能。于此同時,Construction A和Customer A之間的耦合是非常松的,因為,如果有另外一個開發商onstruction B加入進來也構造了Apartment的對象,Customer就可以通過改變選擇條件,輕易的獲得B的房子,而客戶本身不關心房子是A還是B蓋的,這個是典型的面向對象的多態應用。

    總的說來,Bundle在framework的幫助下,使得其他bundle使用其類型定義成為可能。service就是在這些共享的類型定義基礎上產生的具體對象,而使用這些service對象的bundle,必然也是對應共享類型的使用者。
    這種類型共享,在osgi里面叫做"class space". framework運行時通過關聯bundle之間的類型定義,可以構成一個或多個"class space",而某個bundle在framework里面,只能處在一個"class space"里面,不能同時出現在多個"class space"中。
    怎么理解這個話呢?請看下一篇,外星人入侵了。

     

    posted on 2007-07-21 22:28 勤勞的蜜蜂 閱讀(1737) 評論(1)  編輯  收藏

    評論

    # re: OSGi介紹(七)bundle和service(續)[未登錄] 2015-11-10 15:00 Java Fans

    OSGi最好的開發平臺非JXADF莫屬,詳細參見:http://osgi.jxtech.net  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 国产精品亚洲专区在线观看| 最新亚洲人成网站在线观看| 亚洲日本天堂在线| 一级女性全黄生活片免费看| 91精品导航在线网址免费| 永久免费看bbb| 亚洲AV永久无码精品一百度影院 | 亚洲阿v天堂在线| 亚洲国产激情在线一区| 曰韩无码AV片免费播放不卡| 亚洲视频免费在线播放| 亚洲国产成人精品无码久久久久久综合 | 人妻无码中文字幕免费视频蜜桃| 日韩午夜理论免费TV影院| 日本19禁啪啪无遮挡免费动图| 亚洲AV无码久久精品色欲| 亚洲熟妇无码一区二区三区| a级在线免费观看| 精品少妇人妻AV免费久久洗澡| 亚洲AV无码第一区二区三区| 国产精品亚洲精品久久精品| 99久久免费观看| 亚洲乱码国产一区网址| 亚洲欧洲日韩极速播放 | 巨胸喷奶水视频www免费视频| 国产精品免费观看久久| 亚洲av无码国产精品夜色午夜| 美女隐私免费视频看| 在线看片v免费观看视频777| 国产综合亚洲专区在线| 亚洲欧洲av综合色无码| 91久久青青草原线免费| 国产亚洲视频在线播放| 亚洲s码欧洲m码吹潮| 国产精品久久久久久久久免费| 亚洲中文字幕无码久久精品1| 韩国亚洲伊人久久综合影院| 日韩视频在线精品视频免费观看| 国产亚洲婷婷香蕉久久精品| 全部一级一级毛片免费看| 欧洲美熟女乱又伦免费视频|