意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个
对象和组合对象的使用具有一致性。
以下情况使用Composite模式
你想表示对象的部分-整体层次结构
你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
部分示例代码:
这部分内容由于有迭代器夹在中间,感觉有一定难度,难度不在于如何实现迭代器,而在于如何补齐对应的迭代器,使其能够满足程序的测试要求。
既使这样,程序还是稍微有点与书中不同,原因是书中的代码我想破脑袋也无法实现,猜测可能是写错了。
另外,其中有一个头文件是引用BasicClass.h中的,这里面包含了关于List表的部分实现,及其相关ListIterator的实现,在对应的文件中已作了修改(链接:http://blog.youkuaiyun.com/luhouxiang/archive/2008/04/17/2301849.aspx)。需要可到相关页面更新。
到今天,组合模式终于基本了结。
以下为相关类的类图:
代码描述的是一组计算机结构。大体如下:机箱(Cabinet),主板(chassis),总线(bus),磁盘(FloppyDisk),
总线下的各种板卡(Card),程序采用树形结构将这些零件组合成一个计算机,最后给出计算整个机器的价钱的方法。
以下为整个计算机的组成结构,和类图稍有不同
Cabinet(机箱)
|
chassis(主板)
| |
bus(总线) FloppyDisk(磁盘)
|
Card(板卡)
图形从上往下读,机箱下面是主板,主板下包含总线和磁盘,总线下包含板卡
代码部分详细描述了计算机组成的树形结构的表示方法,并利用这种树形结构计算各部件的价钱总数:
//
Composite.h:interfacefortheCCompositeclass.
//
/**/
//////////////////////////////////////////////////////////////////////
#if
!defined(AFX_COMPOSITE_H__4A747028_E312_4DFD_8E52_F9E48CCD5929__INCLUDED_)
#define
AFX_COMPOSITE_H__4A747028_E312_4DFD_8E52_F9E48CCD5929__INCLUDED_

#if
_MSC_VER>1000
#pragma
once
#endif
//
_MSC_VER>1000

#include
"
../BaseClass/BasicClass.h
"

//
##ModelId=481289160296
typedef
float
Currency;
//
##ModelId=4812891602A3
typedef
float
Watt;

//
##ModelId=4812891602B1
class
Equipment
...
{//应该是一个类似抽象类
public:
//##ModelId=4812891602B2
Equipment()...{_name="";}
//##ModelId=4812891602B3
virtual~Equipment()...{}
//##ModelId=4812891602B5
constchar*Name()const...{return_name;}
//virtualWattPower(){}
//##ModelId=4812891602B7
virtualCurrencyNetPrice()
...{
Iterator<ListNode<Equipment*>*>*i=CreateIterator();
Currencytotal=0;
total+=GetCurrency();
for(i->First();!i->IsNull();i->Next())
...{
total+=i->CurrentItem()->_data->NetPrice();//NetPrice();
}
deletei;
returntotal;
return0;
}
//##ModelId=4812891602B9
virtualCurrencyDiscountPrice()...{return0;}
//##ModelId=4812891602C2
virtualvoidAdd(Equipment*)...{}
//##ModelId=4812891602C5
virtualvoidRemove(Equipment*)...{}
//##ModelId=4812891602C8
virtualIterator<ListNode<Equipment*>*>*CreateIterator()
...{
ListNode<Equipment*>*listpoint=_equipmentlist.FirstPoint();
Iterator<ListNode<Equipment*>*>*newit=newListIterator<ListNode<Equipment*>*>(listpoint);
returnnewit;
}
//protected:
//##ModelId=4812891602CA
Equipment(constchar*name)...{_name=name;}
//##ModelId=4812D23D02DA
voidSetCurrency(Currencycur)//设置价钱,每一个构造函数必须调用
...{
_currency=cur;
}
//##ModelId=4812D23D0318
CurrencyGetCurrency()const
...{
return_currency;
}
protected:
//##ModelId=4812D23D0338
List<Equipment*>_equipmentlist;
private:
//##ModelId=4812891602CC
constchar*_name;
//##ModelId=4812D23D0348
Currency_currency;//价钱
}
;
//
##ModelId=4812891602D1
class
FloppyDisk:
public
Equipment
...
{
public:
//##ModelId=4812891602D3
FloppyDisk(constchar*name):Equipment(name)...{SetCurrency(4.6);}
//##ModelId=4812891602D5
virtual~FloppyDisk()...{}
//##ModelId=4812891602E1
virtualWattPower()...{printf("FloppyDisk::Power() ");return0;}
//##ModelId=4812891602E3
virtualCurrencyNetPrice()
...{
printf("FloppyDisk::NetPrice() ");
returnEquipment::NetPrice();
}
//##ModelId=4812891602E5
virtualCurrencyDiscountPrice()...{printf("FloppyDisk::DiscountPrice() ");return0;}
//##ModelId=4812D23D0376
virtualIterator<ListNode<Equipment*>*>*CreateIterator()
...{
printf("FloppyDisk::CreateIterator() ");
returnEquipment::CreateIterator();
}

}
;
//
##ModelId=4812891602F0
class
CompositeEquipment:
public
Equipment
...
{
public:
//##ModelId=4812891602F2
virtual~CompositeEquipment()...{}
//##ModelId=4812891602F4
virtualWattPower()...{printf("CompositeEquipment::Power() ");return0;}
//##ModelId=4812891602F6
virtualCurrencyNetPrice()
...{
printf("CompositeEquipment::NetPrice() ");
returnEquipment::NetPrice();
}
//##ModelId=4812891602F8
virtualCurrencyDiscountPrice()...{printf("CompositeEquipment::DiscountPrice() ");return0;}
//##ModelId=4812891602FA
virtualvoidAdd(Equipment*peq)
...{
_equipmentlist.Append(peq);
}
//##ModelId=481289160300
virtualvoidRemove(Equipment*peq)
...{
_equipmentlist.Remove(peq);
}
//##ModelId=481289160303
virtualIterator<ListNode<Equipment*>*>*CreateIterator()
...{
printf("CompositeEquipment::CreateIterator() ");
returnEquipment::CreateIterator();
}
protected:
//##ModelId=481289160305
CompositeEquipment(constchar*sz):Equipment(sz)...{}
private:
}
;


//
现在我们将计算机的底盘表示为CompositeEquipment的子类Chassis
//
它从CompositeEquipment继承了与子类有关的那些操作。
//
##ModelId=48128916031F
class
Chassis:
public
CompositeEquipment
...
{
public:
//##ModelId=481289160321
Chassis(constchar*sz):CompositeEquipment(sz)...{SetCurrency(8);}
//##ModelId=48128916032E
virtual~Chassis()...{}
//##ModelId=481289160330
virtualWattPower()...{printf("Chassis::Power() ");return0;}
//##ModelId=481289160332
virtualCurrencyNetPrice()
...{
printf("Chassis::NetPrice() ");
returnEquipment::NetPrice();
}
//##ModelId=4812D23D03B4
virtualIterator<ListNode<Equipment*>*>*CreateIterator()
...{
本文介绍了一种设计模式——组合模式的实现方式,该模式通过树形结构表示对象间的部分-整体关系,允许用户一致地处理单个对象和组合对象。以计算机硬件结构为例,展示了如何运用组合模式来组织和计算不同组件的价格。

被折叠的 条评论
为什么被折叠?



