八、Composite(组成)
情景举例:
将对象组合成树形结构以表示“部分-整体”的层次结构。
代码示例:
/* 最关键的抽象类,涵盖了叶子与容器的接口
*/
class Equipment {
public:
virtual ~Equipment();
const char* Name() { return _name; }
/*
*/
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
/*
*/
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator<Equipment*>* CreateIterator();
protected:
Equipment(const char*);
private:
const char* _name;
};
/* 一个叶子的类接口
*/
class FloppyDisk : public Equipment {
public:
FloppyDisk(const char*);
virtual ~FloppyDisk();
/*
*/
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
};
/* 容器的接口,例子中其也是一个抽象类
*/
class CompositeEquipment : public Equipment {
public:
virtual ~CompositeEquipment();
/*
*/
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
/*
*/
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator<Equipment*>* CreateIterator();
/*
*/
protected:
CompositeEquipment(const char*);
private:
List<Equipment*> _equipment;
};
/* 容器的实现使用了Iterator来遍历其子部件
*/
Currency CompositeEquipment::NetPrice () {
Iterator<Equipment*>* i = CreateIterator();
Currency total = 0;
for (i->First(); !i->IsDone(); i->Next()) {
total += i->CurrentItem()->NetPrice();
}
delete i;
return total;
}
/* 申明了几个具体类
*/
class Chassis : public CompositeEquipment {
public:
Chassis(const char*);
virtual ~Chassis();
/*
*/
virtual Watt Power();
virtual Currency NetPrice();
virtual Currency DiscountPrice();
};
/*
*/
class Cabinet : public CompositeEquipment {
public:
Cabinet(const char*);
};
class Bus : public CompositeEquipment {
public:
Bus(const char*);
};
class Card : public Equipment {
public:
Card(const char*);
};
void dummy () {
/* 在主程序中,这些容器与叶子以相同的行为被融合在一起
*/
Cabinet* cabinet = new Cabinet("PC Cabinet");
Chassis* chassis = new Chassis("PC Chassis");
/*
*/
cabinet->Add(chassis);
/*
*/
Bus* bus = new Bus("MCA Bus");
bus->Add(new Card("16Mbs Token Ring"));
/*
*/
chassis->Add(bus);
chassis->Add(new FloppyDisk("3.5in Floppy"));
cout << "The net price is " << chassis->NetPrice() << endl;
个人理解:
组成模式最重要的是理解其类图与对象图的不同:叶子与容器在类图上处与同一层次,而在对象图中容器都是由容器或者叶子组成的。其模式的关键在于找到一个涵盖叶子与容器的抽象类(例子中的Equipment类)