Chasing an mobile web vision

          闖蕩在移動(dòng)互聯(lián)網(wǎng)的世界中

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

          接上一篇的例子,為了更具體一點(diǎn),我們考慮這樣的case,
          假設(shè)房地產(chǎn)開(kāi)發(fā)商construction A采納了規(guī)劃公司design A的方案,打算建造公寓類型的房子CityApartment
          然后客戶A買(mǎi)了一套房子

          用ooa方式分析這個(gè)case,
          我抽象這幾個(gè)實(shí)體:規(guī)劃公司,圖紙類型,開(kāi)發(fā)商,房子,買(mǎi)房人
          然后描述這幾件事情:開(kāi)發(fā)商選擇設(shè)計(jì)圖紙,蓋樓然后銷(xiāo)售;買(mǎi)房人根據(jù)圖紙買(mǎi)房并使用房子

          下面是我用java語(yǔ)言來(lái)簡(jiǎn)單描述它:

          design A 公司

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

           

          開(kāi)發(fā)商construction A

          package construction.a

          import design.a.*;//開(kāi)發(fā)商要按照?qǐng)D紙蓋樓

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


          class Construction implements BundleActivator{

          }



          客戶 costumer A

          package customer.a

          import design.a.*;//客戶要按照?qǐng)D紙選擇房子

          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就會(huì)把BundlB和C與BundleA關(guān)聯(lián)起來(lái),正好描述開(kāi)發(fā)商A選擇design A的圖紙,客戶A也不得不選擇design A的圖紙啦
          可是,單從這里,我們看不出來(lái),開(kāi)發(fā)商和客戶拿同一份圖紙干什么。那我們得必須在BundleB和C的實(shí)現(xiàn)里面寫(xiě)點(diǎn)東西來(lái)說(shuō)明。

          這里給出開(kāi)發(fā)商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));//開(kāi)發(fā)商為房子定價(jià)
             apartment = new CityApartment();//一套房子蓋好
             
          //把房子按照公寓注冊(cè)出去并打廣告,等待客戶來(lái)購(gòu)買(mǎi),framework就相當(dāng)于一個(gè)售樓處兼房屋中介
             context.registerService(Apartment.class.getName()/*公寓類型*/,apartment/*房子作為服務(wù)對(duì)象*/,properties/*與房子相關(guān)的附帶信息*/);
             
            }

            
          //這樣開(kāi)發(fā)商一共注冊(cè)一百套房子
           }

          }



          而客戶的代碼可以如下:

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

          }


          這樣,我們就很清楚的看出,Design A為Construction A和Customer A提供了共同的Apartment定義,才使得他們有交易的可能。于此同時(shí),Construction A和Customer A之間的耦合是非常松的,因?yàn)椋绻辛硗庖粋€(gè)開(kāi)發(fā)商onstruction B加入進(jìn)來(lái)也構(gòu)造了Apartment的對(duì)象,Customer就可以通過(guò)改變選擇條件,輕易的獲得B的房子,而客戶本身不關(guān)心房子是A還是B蓋的,這個(gè)是典型的面向?qū)ο蟮亩鄳B(tài)應(yīng)用。

          總的說(shuō)來(lái),Bundle在framework的幫助下,使得其他bundle使用其類型定義成為可能。service就是在這些共享的類型定義基礎(chǔ)上產(chǎn)生的具體對(duì)象,而使用這些service對(duì)象的bundle,必然也是對(duì)應(yīng)共享類型的使用者。
          這種類型共享,在osgi里面叫做"class space". framework運(yùn)行時(shí)通過(guò)關(guān)聯(lián)bundle之間的類型定義,可以構(gòu)成一個(gè)或多個(gè)"class space",而某個(gè)bundle在framework里面,只能處在一個(gè)"class space"里面,不能同時(shí)出現(xiàn)在多個(gè)"class space"中。
          怎么理解這個(gè)話呢?請(qǐng)看下一篇,外星人入侵了。

           

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

          評(píng)論

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

          OSGi最好的開(kāi)發(fā)平臺(tái)非JXADF莫屬,詳細(xì)參見(jiàn):http://osgi.jxtech.net  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 三原县| 长海县| 楚雄市| 五大连池市| 丹巴县| 咸宁市| 寻乌县| 容城县| 青州市| 蒙山县| 青铜峡市| 睢宁县| 浙江省| 邵阳县| 黄大仙区| 兖州市| 德庆县| 石狮市| 浙江省| 乌拉特前旗| 襄樊市| 长兴县| 新绛县| 大港区| 习水县| 句容市| 临泽县| 深圳市| 龙南县| 富蕴县| 南昌市| 宁陕县| 应城市| 格尔木市| 惠安县| 湘乡市| 四会市| 昆明市| 石泉县| 黄大仙区| 凌源市|