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 勤劳的蜜蜂 阅读(1561) 评论(1)  编辑  收藏

评论

# re: OSGi介绍(七)bundle和service(续)[未登录] 2015-11-10 15:00 Java Fans

OSGi最好的开发平台非JXADF莫属,详细参见:http://osgi.jxtech.net  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: