Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1816505
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2012-06-12 10:00:23

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

示例代码:
#include
#include
#include

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 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::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;
}


示例代码二:
#include
#include
#include

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 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::iterator p = m_company.begin();
        while(p != m_company.end())
        {
            (*p)->Display(nDepth + 2);
            p++;
        }
    }
   
    virtual void LineOfDuty()
    {
        vector::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()
{
    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;
}
阅读(552) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~