灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3410回复:0

设计模式学习-----组合模式

楼主#
更多 发布于:2012-12-13 14:40

组合模式


   GOOD:整体和部分可以被一致对待(如WORD中复制一个文字、一段文字、一篇文章都是一样的操作)





[html]
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Component
{
public:
   string m_strName;
   Component(string strName)
   {
       m_strName = strName;
   }
   virtual void Add(Component* com)=0;
   virtual void Display(int nDepth)=0;
};

class Leaf : public Component
{
public:
   Leaf(string strName): Component(strName){}

   virtual void Add(Component* com)
   {
       cout<<"leaf can't add"<<endl;
   }

   virtual void Display(int nDepth)
   {
       string strtemp;
       for(int i=0; i < nDepth; i++)
       {
           strtemp+="-";
       }
       strtemp += m_strName;
       cout<<strtemp<<endl;
   }
};

class Composite : public Component
{
private:
   vector<Component*> m_component;
public:
   Composite(string strName) : Component(strName){}

   virtual void Add(Component* com)
   {
       m_component.push_back(com);
   }

   virtual void Display(int nDepth)
   {
       string strtemp;
       for(int i=0; i < nDepth; i++)
       {
           strtemp+="-";
       }
       strtemp += m_strName;
       cout<<strtemp<<endl;

       vector<Component*>::iterator p=m_component.begin();
       while (p!=m_component.end())
       {
           (*p)->Display(nDepth+2);  
           p++;
       }
   }

};

//客户端
int main()
{
   Composite* p=new Composite("小王");
   p->Add(new Leaf("小李"));
   p->Add(new Leaf("小赵"));

   Composite* p1 = new Composite("小小五");
   p1->Add(new Leaf("大三"));

   p->Add(p1);
   p->Display(1);
   return 0;
}




[html]
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Company
{
protected:
   string m_strName;
public:
   Company(string strName)
   {
       m_strName = strName;
   }

   virtual void Add(Company* c)=0;
   virtual void Display(int nDepth)=0;
   virtual void LineOfDuty()=0;
};

class ConcreteCompany: public Company
{
private:
   vector<Company*> m_company;
public:
   ConcreteCompany(string strName):Company(strName){}

   virtual void Add(Company* c)
   {
       m_company.push_back(c);
   }
   virtual void Display(int nDepth)
   {
       string strtemp;
       for(int i=0; i < nDepth; i++)
       {
           strtemp += "-";
       }
       strtemp +=m_strName;
       cout<<strtemp<<endl;

       vector<Company*>::iterator p=m_company.begin();
       while (p!=m_company.end())
       {
           (*p)->Display(nDepth+2);
           p++;
       }
   }
   virtual void LineOfDuty()
   {
       vector<Company*>::iterator p=m_company.begin();
       while (p!=m_company.end())
       {
           (*p)->LineOfDuty();
           p++;
       }
   }
};

class HrDepartment : public Company
{
public:

   HrDepartment(string strname) : Company(strname){}

   virtual void Display(int nDepth)
   {
       string strtemp;
       for(int i = 0; i < nDepth; i++)
       {
           strtemp += "-";
       }

       strtemp += m_strName;
       cout<<strtemp<<endl;
   }
   virtual void Add(Company* c)
   {
       cout<<"error"<<endl;
   }

   virtual void LineOfDuty()
   {
       cout<<m_strName<<":招聘人才"<<endl;
   }
};

//客户端:
int main()
{    www.atcpu.com
   ConcreteCompany *p = new ConcreteCompany("清华大学");
   p->Add(new HrDepartment("清华大学人才部"));

   ConcreteCompany *p1 = new ConcreteCompany("数学系");
   p1->Add(new HrDepartment("数学系人才部"));

   ConcreteCompany *p2 = new ConcreteCompany("物理系");
   p2->Add(new HrDepartment("物理系人才部"));

   p->Add(p1);
   p->Add(p2);

   p->Display(1);
   p->LineOfDuty();
   return 0;
}

喜欢0 评分0
游客

返回顶部