您的位置:首页 > 其它

设计模式---组合模式

2015-07-10 22:57 393 查看
组合模式是属于结构模式的一种设计方法。首先是定义

将对象组合成树形结构以表示部分–整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

结构图



意图

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

适用性

1 你想表示对象的部分–整体层次结构

2 你希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象

协作

用户使用Compoment类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给他的子部件,在转发之前或之后可能执行以下辅助操作

优点

1 定义了包含基本对象和组合对象的类层次结构,客户代码中,任何可以使用基本对象的地方都可以用到组合对象

2 简化客户代码。客户可以一致的对待单个对象和组合对象,因此可以不需要写在定义组合对象中充斥着选择语句的函数

3 使得更容易增加新类型的组件

4 使你的设计更加一般化

实现注意的问题

1 显示的父部件引用。通常在Component类中定义父部件引用,可以简化组合结构的便利和管理,Leaf和Composite可以继承这个引用以及管理操作

2 共享组件

3 最大化Component接口

4 声明管理子部件的操作

透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add,remove,这样实现Component的接口的所有子类都具备Add和remove的方法。

安全方式:在Component中不去声明Add和remove方法,子类的leaf不需要实现它,而是在Component声明管理子类对象的方法,不过由于不够透明,客户端的调用需要做一些判断,带来了不便

5 Component是否应该实现一个Component列表

6 子部件排序

7 使用高速缓存提高性能

8 应该由Composite删除它的子节点,但如果leaf不会改变,可以被共享

9 选用哪一种数据结构

公司的架构就可以很好的采用组合方式进行模拟

// Composite.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "ConcretaCompany.h"
#include "HRDepartMent.h"
#include "FinanceDepartMent.h"

int _tmain(int argc, _TCHAR* argv[])
{
ConcretaCompany* root = new ConcretaCompany("北京总公司");
root->add(new HRDepartMent("总公司人力部"));
root->add(new FinanceDepartMent("总公司财政部"));

ConcretaCompany* comp = new ConcretaCompany("上海华东公司");
comp->add(new HRDepartMent("上海华东公司人力部"));
comp->add(new FinanceDepartMent("上海华东公司财政部"));
root->add(comp);

ConcretaCompany* comp1 = new ConcretaCompany("南京办事处");
comp1->add(new HRDepartMent("南京办事处人力部"));
comp1->add(new FinanceDepartMent("南京办事处财政部"));
root->add(comp1);

root->display();
root->lineOfDuty();

return 0;
}
/************************************************************************
@fileName:Company.h
@function: 组合模式中的Component类
@author: jaime
@ver: 1.0.0
************************************************************************/

#pragma once

#include <string>
using namespace std;
class Company
{
public:
Company(string name);
~Company();
virtual void add(Company* c);
virtual void remove(Company* c);
virtual void display();
virtual void lineOfDuty();
protected:
string m_name;
};

#include "Company.h"

Company::Company(string name)
:m_name(name)
{

}

Company::~Company()
{
}

void Company::add(Company* c)
{

}

void Company::remove(Company* c)
{

}

void Company::display()
{

}

void Company::lineOfDuty()
{

}
/************************************************************************
@fileName:ConcretaCompany.h
@function: 组合模式中的Composite类
@author: jaime
@ver: 1.0.0
************************************************************************/

#pragma once

#include "Company.h"
#include <list>
#include <string>

using namespace std;

class ConcretaCompany : public Company
{
public:
ConcretaCompany(string name);
~ConcretaCompany();
virtual void add(Company* c);
virtual void remove(Company* c);
virtual void display();
virtual void lineOfDuty();
private:
list<Company*> m_children;
};

#include "ConcretaCompany.h"

ConcretaC
4000
ompany::ConcretaCompany(string name)
:Company(name)
{

}

ConcretaCompany::~ConcretaCompany()
{
}

void ConcretaCompany::add(Company* c)
{
m_children.push_back(c);
}

void ConcretaCompany::remove(Company* c)
{
m_children.remove(c);
}

void ConcretaCompany::display()
{
list<Company*>::iterator it = m_children.begin();
while ( it != m_children.end() )
{
(*it)->display();
it++;
}
}

void ConcretaCompany::lineOfDuty()
{
list<Company*>::iterator it = m_children.begin();
while ( it != m_children.end() )
{
(*it)->lineOfDuty();
it++;
}
}
/************************************************************************
@fileName:FinanceDepartMent.h
@function: 组合模式中的leaf类,财政部
@author: jaime
@ver: 1.0.0
************************************************************************/

#pragma once

#include "Company.h"
#include <string>

using namespace std;

class FinanceDepartMent : public Company
{
public:
FinanceDepartMent(string name);
~FinanceDepartMent();
virtual void display();
virtual void lineOfDuty();
private:
};
#include "FinanceDepartMent.h"
#include <iostream>

using namespace std;

FinanceDepartMent::FinanceDepartMent(string name)
:Company(name)
{

}

FinanceDepartMent::~FinanceDepartMent()
{
}

void FinanceDepartMent::display()
{
cout << "财政部" <<m_name<<endl;
}

void FinanceDepartMent::lineOfDuty()
{
cout << "收支管理" << endl;
}
/************************************************************************
@fileName:HRDepartMent.h
@function: 组合模式中的leaf类,人力部
@author: jaime
@ver: 1.0.0
************************************************************************/

#pragma once

#include "Company.h"
#include <string>

using namespace std;

class HRDepartMent : public Company
{
public:
HRDepartMent(string name);
~HRDepartMent();
virtual void display();
virtual void lineOfDuty();
private:
};

#include "HRDepartMent.h"
#include <iostream>

using namespace std;

HRDepartMent::HRDepartMent(string name)
:Company(name)
{

}

HRDepartMent::~HRDepartMent()
{
}

void HRDepartMent::display()
{
cout << "HR" <<m_name<<endl;
}

void HRDepartMent::lineOfDuty()
{
cout << "培训" << endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息