论坛登陆 用户: 密码:
联系我们
设为首页
加入收藏
业界新闻 网络编程 程序开发 网页图象 聊天通讯 软件应用 网络安全 硬件学堂 教育频道 站长club
  ·推荐新闻
 
·美前任官员认为amd告倒英特
·搜索引擎关键字排行简介
·网站优化教程(一)
·msn近期遭受木马病毒骚扰 用
·用qq管理你的系统^_^ 
·测评中心金山毒霸联合发布7
·qq群聊实名 普通用户不受影
·雅虎思科联手推数字邮件签名
·这18条背下来没人敢和你忽悠
·自己动手,拯救丢失的硬盘数
  ·资料搜索
 
  ·相关文章
·深度探索c++对象模型(完结篇)
·深度探索c++对象模型(10)
·深度探索c++对象模型(9)
·深度探索c++对象模型(8)
·深度探索c++对象模型(7)
·深度探索c++对象模型(6)
·深度探索c++对象模型(5)
·深度探索c++对象模型(4)
·深度探索c++对象模型(3)
·深度探索c++对象模型(2)
  ·热门新闻
首页>>程序开发>>c/c++区>>文章正文

c++设计模式之composite


 日期:2005-7-18 9:13:28     来源:易特网络技术   编辑:黑鹰  点击:
一、功能

  表示“部分-整体”关系,并使用户以一致的方式使用单个对象和组合对象。

  二、结构图

  上图中,也可以做些扩展,根据需要可以将leaf和composite做为抽象基类,从中派生出子类来。

  三、优缺点

  优点:对于composite模式,也许人们一开始的注意力会集中在它是如何实现组合对象的。但composite最重要之处在于用户并不关心是组合对象还是单个对象,用户将以统一的方式进行处理,所以基类应是从单个对象和组合对象中提出的公共接口。
  缺点:composite最大的问题在于不容易限制组合中的组件。

  四、实现

  有时需要限制组合中的组件,即希望一个composite只能有某些特定的leaf。这个问题我是用多继承和动态类型转换来解决的。假如组合对象composite1只能包含单个对象concreteleaf1,composite2可以包含单个对象concreteleaf1和concreteleaf2。如下图所示:

  上图中的类层次比较多,使用了abstractleaf1和abstractleaf2,但没使用abstractcomposite1和abstractcomposite2,这个并不重要,也可以把abstractleaf1和abstractleaf2去掉,这个并不重要,可以根据具体情况决定要不要。
简单的代码实现如下:

namespace designpattern_composite
{
class component
{
public:
virtual void operation() = 0 ;
virtual void add(component*) {}
} ;

class abstractcomponent1 : virtual public component {} ;

class abstractleaf1 : virtual public abstractcomponent1 {} ;

class composite1 : public abstractcomponent1
{
public:
virtual void operation() { /* do operation */ }
virtual void add(component*) ;
} ;
void composite1::add(component *p)
{
abstractcomponent1 *pc1 = dynamic_cast<abstractcomponent1*>(p) ;
if (pc1 == null) return ;
// do add operation
}

class abstractcomponent2 : virtual public component {} ;

class abstractleaf2 : virtual public abstractcomponent2 {} ;

class composite2 : public abstractcomponent2
{
public:
virtual void operation() { /* do operation */ }
virtual void add(component*) ;
} ;
void composite2::add(component *p)
{
abstractcomponent2 *pc2 = dynamic_cast<abstractcomponent2*>(p) ;
if (pc2 == null) return ;
// do add operation
}

class concreteleaf1 : public abstractleaf1
{
public:
virtual void operation() { /* do operation */ }
} ;

class concreteleaf2 : public abstractleaf1, public abstractleaf2
{
public:
virtual void operation() { /* do operation */ }
} ;
}

客户端代码:

using namespace designpattern_composite ;

component *pc1 = new concreteleaf1() ;
component *pc2 = new concreteleaf2() ;
component *pc3 = new composite1() ;
component *pc4 = new composite2() ;
pc3->add(pc1) ; // ok
pc3->add(pc2) ; // ok
pc3->add(pc3) ; // ok
pc3->add(pc4) ; // fail
pc4->add(pc1) ; // fail
pc4->add(pc2) ; // ok
pc4->add(pc3) ; // fail
pc4->add(pc4) ; // ok
}

  有两点需要注意,一是因为用了多继承,所以需要使用virtual inheritance。二是要用dynamic_cast来判断是否允许组合该组件。

  五、示例代码

namespace designpattern_composite
{
// class component
class component
{
public:
virtual void operation() = 0 ;
virtual void add(component*) {}
} ;

// class leaf
class leaf : public component
{
public:
virtual void operation() {}
} ;

// class composite
class composite : public component
{
public:
virtual void add(component *p) { _list.push_back(p) ; }
virtual void operation()
{
vector< component* >::const_iterator it ;
for (it = _list.begin(); it != _list.end(); it++)
(*it)->operation() ;
}
private:
vector< component* > _list ;
} ;
}

  六、实例

  (1)junit中就用的是composite模式。

上一篇:深度探索c++对象模型(完结篇)
下一篇:关于c++中rtti的编码实现
[发送给好友] [打印本页] [关闭窗口] [返回顶部转载请注明来源:http://www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
责任编辑: 黑鹰 投稿作者: 易特网络
信息来源: 易特网络技术 录入时间: 2005-7-18 9:13:28
浏览次数: 投稿信箱: shtghy@163.com
设置首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
copyrights ©2004-2005 iyit.net all rights reserved. 网站合作、广告联系qq:147007642、466949678
易特网络技术 点击这里给我发消息