`
isiqi
  • 浏览: 16486593 次
  • 性别: 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#语言环境下的设计模式探讨,具体到第9篇讨论的是“Composite组合模式”。这一模式属于结构型模式的一种,旨在解决...

    设计模式之组合模式(Composite Pattern)

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

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

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

    设计模式之结构型模式

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

    设计模式面面观(11):组合模式(Composite Pattern)-结构型模式

    组合模式是软件工程中的一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系,使得客户端代码可以一致地处理单个对象和对象组合。在组合模式中,部分和整体通过统一的接口进行交互,这种“部分”和...

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

    组合模式是一种结构型设计模式,它允许我们创建部分-整体层次结构,使得部分与整体具有相同的行为。在C#中,这种模式可以帮助我们构建复杂的树形结构,使得客户端代码可以一致地处理单个对象和对象集合。让我们深入...

    设计模式_组合模式.zip

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

    人人都懂设计模式 人人都懂设计模式

    设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中,作者罗伟富通过 Python 实现了 23 种经典设计模式,包括 Singleton 模式、Factory 模式、Observer 模式等。这些模式可以帮助开发者更好地...

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

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

    C#设计模式结构型

    C#设计模式结构型主要涉及如何将类和对象组织成更加合理的结构,以适应不同的软件设计需求。结构型设计模式在面向对象编程中尤为重要,因为它们能够提高系统的灵活性、可扩展性和可维护性。在结构型设计模式中,合成...

    C++设计模式课件20_Composite_组合模式.pdf

    设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。本篇主要探讨的是结构型模式之一——组合模式。 #### 二、组合模式定义 组合模式(Composite Pattern)是一种树形结构的设计模式,它将对象组合成树...

    设计模式_结构型_组合模式.md

    组合模式是软件设计模式中的一种,属于结构型设计模式。其核心思想是将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 ### 组合模式定义 组合模式允许将...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    设计模式C++学习之组合模式(Composite)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够以统一的方式处理单个对象和对象集合。在C++中,组合模式的应用可以帮助我们构建灵活且易于操作的对象层次结构,使得客户端...

    java常用设计模式-组合模式

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...

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

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

    24种设计模式以及混合设计模式

    首先,设计模式分为三大类:创建型、结构型和行为型。创建型设计模式关注对象的创建过程,如单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)和建造者模式(Builder)。这些模式提供...

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

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

Global site tag (gtag.js) - Google Analytics