`
isiqi
  • 浏览: 16004337 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

阅读更多

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

部分示例代码:

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

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

另外,其中有一个头文件是引用BasicClass.h中的,这里面包含了关于List表的部分实现,及其相关ListIterator的实现,在对应的文件中已作了修改(链接:http://blog.csdn.net/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_)
#defineAFX_COMPOSITE_H__4A747028_E312_4DFD_8E52_F9E48CCD5929__INCLUDED_

#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000

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

//##ModelId=481289160296
typedeffloatCurrency;
//##ModelId=4812891602A3
typedeffloatWatt;


//##ModelId=4812891602B1
classEquipment
...{//应该是一个类似抽象类
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
classFloppyDisk:publicEquipment
...{
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
classCompositeEquipment:publicEquipment
...{
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
classChassis:publicCompositeEquipment
...{
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
分享到:
评论

相关推荐

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式)

    c++设计模式-结构型模式-组合模式

    组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构...

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) (Level 300)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) (Level 300)

    设计模式之结构型模式

    本资源是用VC6.0实现的结构型设计模式,主要有BridgePattern、AdapterPattern、DecoratorPattern、CompositePattern、FlyweightPattern、FacadePattern、ProxyPattern六种模式,参考于《23种设计模式(C++).pdf》

    设计模式_组合模式.zip

    这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...

    C#面向对象设计模式纵横谈\9 结构型模式Composite组合模式.zip

    在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要... 这是第9节:结构型模式Composite组合模式

    C#设计模式结构型

    C#设计模式-结构型相关课件 合成模式(Composite) • 设计方案一: 合成模式(Composite) • 设计方案二 合成模式(Composite) • 设计方案一和设计方案二的区别 – 设计方案二使得客户端更不需要关心所需处理的...

    软件设计模式—结构型模式讲义

    软件设计模式,结构型模式:Adapter Bridge Composite Decorator Façade FlyWeight Proxy

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    组合模式(Composite Pattern)-结构型模式 (0%) &lt;br&gt;讲义书写模式 在实际的讲解中我会用一套模式来讲述我对设计模式的理解 1.给出当前章节模式的名称 2.讲述一个小故事,提出问题 3.回答这个...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(9):Composite 组合模式(结构型模式) C#面向对象设计模式纵横谈(10):Decorator 装饰模式(结构型模式) C#面向对象设计模式纵横谈(11):Facade 外观模式(结构型模式) C#面向对象设计...

    组合模式 Composite Pattern

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及...这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

    23种设计模式 (创建型,结构型,行为型)

    组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式(Flyweight Pattern) 12. 代理模式(Proxy Pattern) 13. 模板方法(Template Method) 14. 命令模式(Command Pattern) 15. 迭代...

    设计模式可复用面向对象软件的基础.zip

    本书设计实例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。本书分类描述了一组设计良好,表达清楚的软件设计模式,这些模式在实用环境下有特别有用...

    C++ Composite模式

    23种设计模式之八(结构型模式)Composite模式

    设计模式精解-GoF 23种设计模式解析

    2 结构型模式 2.1 Bridge模式 2.2 Adapter模式 2.3 Decorator模式 2.4 Composite模式 2.5 Flyweight模式 2.6 Facade模式 2.7 Proxy模式 3 行为模式.....55 3.1 Template模式 3.2 Strategy模式 3.3 State模式 ...

    设计模式--C++

    1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    33种JAVA设计模式DEMO

    2 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式(Filter、Criteria Pattern) ...

    设计模式(.PDF)

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

    《设计模式》中文版(23个设计模式的介绍与运用)

    1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象接口 9 1.6.4 描述对象...

Global site tag (gtag.js) - Google Analytics