设计模式---组合模式

原创 2015年07月10日 22:57:03

组合模式是属于结构模式的一种设计方法。首先是定义
将对象组合成树形结构以表示部分–整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
结构图
组合模式结构图
意图
将对象组合成树形结构以表示“部分–整体”的层次结构。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"

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

JAVA设计模式初探之组合模式

先看看组合模式的定义吧:“将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。”    就拿剪发办卡的事情来分析一下吧。    首先,一张卡可...
  • jason0539
  • jason0539
  • 2014年03月31日 08:40
  • 22736

设计模式——组合模式+案例

先给个代码地址吧 https://github.com/yyfyyf1994/knowledge/tree/master/src/yyf/designpatterns/composite ...
  • qq_18860653
  • qq_18860653
  • 2016年11月21日 16:51
  • 706

设计模式(结构型)之组合模式(Composite Pattern)

组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂的元素,从而使得客户程序与复杂元素的内部结构解耦。组合模式可以优化处理递归或...
  • yanbober
  • yanbober
  • 2015年04月30日 15:14
  • 2572

Java 设计模式——组合模式

有时我们可能会被要求处理一个层级结构明显的对象,比如上下级的公司员工、比如层级嵌套的文件夹,还有丰富多彩的美食菜单。可是,我们可能要屡试不爽地编写深度搜索代码、要小心翼翼地编写递归逻辑。现在你可以忘掉...
  • u013761665
  • u013761665
  • 2016年05月17日 17:39
  • 7816

Java设计模式(五) 多态的极致应用——组合模式

本文介绍了组合模式的概念,UML类图,优缺点,实例讲解以及组合模式(未)遵循的OOP原则。...
  • Habren
  • Habren
  • 2016年06月08日 07:25
  • 1602

大话设计模式—组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,...
  • lmb55
  • lmb55
  • 2016年04月01日 22:07
  • 2053

Python设计模式——组合模式

组合模式(Composite Pattern)可用来统合类体系中的这两种对象,一种对象能够包含体系中的其他对象,另一种为基本的单元对象,并不能包含其他对象。...
  • qingyunianer
  • qingyunianer
  • 2015年03月11日 09:28
  • 386

c++设计模式之组合模式

组合模式(Composite Pattern)-结构型 意图:组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。 举例:组合模式让...
  • bbs375
  • bbs375
  • 2016年07月25日 19:09
  • 536

.NET中的设计模式三:组合模式

组合模式(Composite)是一种“结构型”模式(Structural)。结构型模式涉及的对象为两个或两个以上,表示对象之间的活动,与对象的结构有关。 先举一个组合模式的小小例子:如图:系统中有两种...
  • luoboqingcai
  • luoboqingcai
  • 2004年11月25日 07:48
  • 740

设计模式--组合模式--商品排序案例

所有的例子均来源与实际开发项目 本节介绍组合模式的使用–商品结果排序评分系统...
  • yangxy81118
  • yangxy81118
  • 2014年08月20日 19:48
  • 2939
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式---组合模式
举报原因:
原因补充:

(最多只允许输入30个字)