设计模式——组合模式

        设计模式是人们从长期的软件开发实战中总结出来的一些经验之谈,为软件领域中的开发人员提供了一种使用专家设计经验的有效途径,通常是多个设计模式结合使用。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,只有通过大量的编程实践才能真正领悟设计模式的精髓。在参加校招前我翻看了部分设计模式相关的书,对于每个设计模式模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式》两本书以及借鉴其他博客园博文的优秀部分。本文介绍观察者模式的实现。希望对大家加深对设计模式的理解有一点帮助。

 

        将对象组合成树形结构以表示“部分-整体”的层次结构。C o m po s i t e 使得用户对单个对象和组合对象的使用具有一致性。

  • 你想表示对象的部分-整体层次结构。
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

 

一、举例

这个例子是书上的,假设有一个公司的组结结构如下:




它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点。

而且最关健的是,它的每一层结构都很相似。

 

代码实现如下:

#include
   
    
#include
    
     
#include
     
      
usingnamespace  std;
 
//公司类,提供接口 
classCompany     
{   
public:   
    Company(stringname) 
    { 
       m_name=name; 
    }   
     
    virtual~Company() 
    {}   
     
    virtualvoidAdd(Company*pCom) 
    {}   
     
    virtualvoidDisplay(intdepth) 
    {} 
 
protected: 
    stringm_name;   
}; 
 
//具体公司 
classConcreteCompany:publicCompany     
{   
public:   
    ConcreteCompany(stringname):Company(name) 
    {} 
 
    virtual~ConcreteCompany() 
    {} 
 
    //增加子树或叶子 
    voidAdd(Company*pCom) 
    { 
       m_listCompany.push_back(pCom); 
    } 
     
    //显示 
    voidDisplay(intdepth) 
    { 
       for(inti=0;i
      
       ::iteratoriter=m_listCompany.begin();   
         
       for(;iter!=m_listCompany.end();iter++)//显示下层结点   
       {     
           (*iter)->Display(depth+2); 
       } 
    } 
 
private:   
    list
       
        m_listCompany;   
};   
 
//具体的部门,财务部   
classFinanceDepartment:publicCompany    
{ 
public:   
    FinanceDepartment(stringname):Company(name) 
    {}   
     
    virtual~FinanceDepartment() 
    {}   
     
    //只需显示,无限添加函数,因为已是叶结点   
    virtualvoidDisplay(intdepth) 
    {   
       for(inti=0;i
        
         Add(leaf1); root->Add(leaf2); //华东分公司 Company*mid1=newConcreteCompany("华东分公司"); Company*leaf3=newFinanceDepartment("华东分公司财务部"); Company*leaf4=newHRDepartment("华东分公司人力资源部"); mid1->Add(leaf3); mid1->Add(leaf4); root->Add(mid1); //南京办事处 Company*mid2=newConcreteCompany("南京办事处"); FinanceDepartment*leaf5=newFinanceDepartment("南京办事处财务部"); HRDepartment*leaf6=newHRDepartment("南京办事处人力资源部"); mid2->Add(leaf5); mid2->Add(leaf6); root->Add(mid2); //杭州办事处 Company*mid3=newConcreteCompany("杭州办事处"); FinanceDepartment*leaf7=newFinanceDepartment("杭州办事处财务部"); HRDepartment*leaf8=newHRDepartment("杭州办事处人力资源部"); mid3->Add(leaf7); mid3->Add(leaf8); mid2->Add(mid3); root->Display(0); deleteleaf1; deleteleaf2; deleteleaf3; deleteleaf4; deleteleaf5; deleteleaf6; deleteleaf7; deleteleaf8; deletemid1; deletemid2; deleteroot; return0; } 
        
       
      
     
    
   

二、说明

1. 上面公司的结构图其实就是整体与部分的关系,而且的话整体与部分可以一致对待,因为有很多相似之处嘛。

2. 这棵树有两种几能,要么是棵叶,要么是子棵。

其实这种模式就是组合模式。

 

三、组合模式

定义:将对象组合成树形结构以表示“部分-整体”的层次结构。组合使得用户对单个对象和组合对象的使用具有一致性

要注意两点:

1. “树形”,必须是一种层次结构,有可以向下延伸的分枝,也有不变的树叶。

2. "一致性",也就是要具有很多相似性。

结构图如下:




component:主要是定义统一的接口,说白了也就是提取出相似性。

composite:定义分枝节点,也就是子树。

leaf:定义叶节点,叶节点是没有子节点的。

 

        好啦,关于组合模式就介绍到这里了,希望你已经掌握了这个模式并且可以熟练的使用它,那么本博文的效果就达到了。如果你还觉得意犹未尽,那么可以去看看博主的其他设计模式的介绍哦。

 

    关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。

    关于设计模式,我推荐大家看看以下博客写的博文,关于设计模式的讲解将的特别好,我从中学习了很多,我的设计模式中的部分博文就是从这里借鉴过来的。

    博客链接:http://blog.youkuaiyun.com/wuzhekai1985

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值