第35章(1 / 1)

大话设计模式 吴强 969 字 2个月前

小A:“组合模式比较简单,也很容易学习,当你面对一个树形结构的时候,脑筋就该多转一圈:是否可以在该结构中使用组合模式?”

大B:“我跟你讲一种简单的方法:定义一个公用的接口,让组合对象和单个对象都去实现该接口。因此,如果面对单个对象,则调用单个对象的方法;如果面对组合对象,递归遍历之,依次调用每个对象的方法;单个对象:相当于树形结构中的叶节点,它不包含任何子对象。”

小A:“如何去实现组合模式呢?”

大B:“组合对象相当于树形结构中的枝节点,它可以包含更小的枝对象,也可以包含叶对象。下面的代码是以抽象类定义,一般尽量用接口interface。”

publicabstractclassEquipment

{

privateStringname;

//实价

publicabstractdoublenetPrice();

//折扣价格

publicabstractdoublediscountPrice();

//增加部件方法

publicbooleanadd(Equipmentequipment){returnfalse;}

//删除部件方法

publicbooleanremove(Equipmentequipment){returnfalse;}

//注重这里,这里就提供一种用于访问组合体类的部件方法。

publicIteratoriter(){returnnull;}

publicEquipment(finalStringname){this.name=name;}

}

大B:“抽象类Equipment就是Component定义,代表着组合体类的对象们,Equipment中定义几个共同的方法。”

publicclassDiskextendsEquipment

{

publicDisk(Stringname){super(name);}

//定义Disk实价为。

publicdoublenetPrice(){return1.;}

//定义了disk折扣价格是0.5对折。

publicdoublediscountPrice(){return.5;}

}

小A:“什么是Disk?”

大B:“Disk是组合体内的一个对象,或称一个部件,这个部件是个单独元素(Primitive)。还有一种可能是,一个部件也是一个组合体,就是说这个部件下面还有‘儿子’,这是树形结构中通常的情况,应该比较轻易理解。”

现在我们先要定义这个组合体:

abstractclassCompositeEquipmentextendsEquipment

{

privateinti=0;

//定义一个Vector用来存放‘儿子’

privateLsitequipment=newArrayList();

publicCompositeEquipment(Stringname){super(name);}

publicbooleanadd(Equipmentequipment){

this.equipment.add(equipment);

returntrue;

}

publicdoublenetPrice()

{

doublenetPrice=0.;

Iteratoriter=equipment.iterator();

for(iter.hasNext())

netPrice+=((Equipment)iter.next()).netPrice();

returnnetPrice;

}

publicdoublediscountPrice()

{

doublediscountPrice=0.;

Iteratoriter=equipment.iterator();

for(iter.hasNext())

discountPrice+=((Equipment)iter.next()).discountPrice();

returndiscountPrice;

}

//注重这里,这里就提供用于访问自己组合体内的部件方法。

//上面Disk之所以没有,是因为Disk是个单独(Primitive)的元素。

publicIteratoriter()

{

returnequipment.iterator()

{

//重载Iterator方法

publicbooleanhasNext(){returni