设计模式中结构型模式(三)组合模式(Composite)

意图:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个
对象和组合对象的使用具有一致性。
以下情况使用Composite模式
你想表示对象的部分-整体层次结构
你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

部分示例代码:

这部分内容由于有迭代器夹在中间,感觉有一定难度,难度不在于如何实现迭代器,而在于如何补齐对应的迭代器,使其能够满足程序的测试要求。

既使这样,程序还是稍微有点与书中不同,原因是书中的代码我想破脑袋也无法实现,猜测可能是写错了。

另外,其中有一个头文件是引用BasicClass.h中的,这里面包含了关于List表的部分实现,及其相关ListIterator的实现,在对应的文件中已作了修改(链接:http://blog.csdn.net/luhouxiang/archive/2008/04/17/2301849.aspx)。需要可到相关页面更新。

到今天,组合模式终于基本了结。

以下为相关类的类图:

设计模式中结构型模式(三)组合模式(Composite)

代码描述的是一组计算机结构。大体如下:机箱(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()
...{
http://images.csdn.net/syntaxhighlighting/OutliningIn
分享到:
评论

你可能感兴趣的:(设计模式,.net,Blog)