组合模式(Composite Pattern)

组合模式使得用户对单个对象和组合对象的使用具有一致性。

有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。

定义

(GoF《设计模式》):将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

涉及角色:

1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。

2.Leaf 在组合中表示叶子结点对象,叶子结点没有子结点。

3.Composite 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。

适用性

以下情况下适用Composite模式:

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

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

组合模式造价信息

市场价 信息价 询价
材料名称 规格/型号 市场价
(除税)
工程建议价
(除税)
行情 品牌 单位 税率 供应商 报价日期
模数式伸缩缝 C40 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 E40 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 Z80 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 E80 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 F40 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 Z40 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 C80 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
模数式伸缩缝 F80 查看价格 查看价格

OVM

m 13% 柳州东方工程橡胶制品有限公司
材料名称 规格/型号 除税
信息价
含税
信息价
行情 品牌 单位 税率 地区/时间
组合烘箱 查看价格 查看价格

台班 汕头市2012年2季度信息价
组合烘箱 查看价格 查看价格

台班 汕头市2011年4季度信息价
组合烘箱 查看价格 查看价格

台班 汕头市2011年1季度信息价
组合烘箱 查看价格 查看价格

台班 广州市2010年3季度信息价
组合烘箱 查看价格 查看价格

台班 广州市2009年3季度信息价
组合烘箱 查看价格 查看价格

台班 汕头市2009年3季度信息价
组合烘箱 查看价格 查看价格

台班 汕头市2009年1季度信息价
组合烘箱 查看价格 查看价格

台班 汕头市2008年3季度信息价
材料名称 规格/需求量 报价数 最新报价
(元)
供应商 报价地区 最新报价时间
情景模式 根据不同情景模式设置多系统控制设备的指令集合|1项 3 查看价格 霍尼韦尔(中国)有限公司 广东   2021-06-18
体感互动识别模式 支持单人识别模式|2套 1 查看价格 北京华创盛远科技有限公司 全国   2022-08-10
体感互动识别模式 支持单人识别模式|2套 1 查看价格 广州恒纳文化创意有限公司 全国   2022-10-24
体感互动识别模式 支持单人识别模式|2套 2 查看价格 安徽东一特电子技术有限公司 全国   2022-09-21
模式管理模块 提供控制逻辑或运行模式编辑功能,|1套 1 查看价格 施耐德电气(中国)投资有限公司 全国   2018-11-30
模式龙头 宝龙056|9512套 1 查看价格 宝龙卫浴 广东  阳江市 2015-10-30
模式燃气表 J40|4只 1 查看价格 成都市三宇仪表科技发展有限公司 四川  成都市 2011-12-13
模式小便阀 C-05|6791件 1 查看价格 佛山市法恩洁具有限公司广州办事处 广东  广州市 2015-08-10

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。

如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。

基于Java的样例:

比如现实中公司内各部门的层级关系

抽象接口类:

package com.zyh.designpattern.composite;

public abstract class Company {

private String name;

public Company(String name) {

super();

this.name = name;

}

public Company(){}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

protected abstract void add(Company company);

protected abstract void romove(Company company);

protected abstract void display(int depth);

}

枝结点类:

package com.zyh.designpattern.composite;

import java.util.ArrayList;

import java.util.List;

public class ConcreteCompany extends Company {

private List cList;

public ConcreteCompany() {

cList = new ArrayList();

}

public ConcreteCompany(String name) {

super(name);

cList = new ArrayList();

}

@Override

protected void add(Company company) {

// TODO Auto-generated method stub

cList.add(company);

}

@Override

protected void display(int depth) {

// TODO Auto-generated method stub

StringBuilder sb = new StringBuilder("");

for (int i = 0; i < depth; i ) {

sb.append("-");

}

System.out.println(new String(sb) this.getName());

for (Company c : cList) {

c.display(depth 2);

}

}

@Override

protected void romove(Company company) {

// TODO Auto-generated method stub

cList.remove(company);

}

}

两个叶结点类:

------------------------- 1---------------------------.

package com.zyh.designpattern.composite;

public class HRDepartment extends Company {

public HRDepartment(String name) {

super(name);

}

@Override

protected void add(Company company) {

}

@Override

protected void display(int depth) {

// TODO Auto-generated method stub

StringBuilder sb = new StringBuilder("");

for (int i = 0; i < depth; i ) {

sb.append("-");

}

System.out.println(new String(sb) this.getName());

}

@Override

protected void romove(Company company) {

}

}

----------------2-------------------

package com.zyh.designpattern.composite;

public class FinanceDepartment extends Company {

public FinanceDepartment(String name) {

super(name);

}

@Override

protected void add(Company company) {

}

@Override

protected void display(int depth) {

// TODO Auto-generated method stub

StringBuilder sb = new StringBuilder("");

for (int i = 0; i < depth; i ) {

sb.append("-");

}

System.out.println(new String(sb) this.getName());

}

@Override

protected void romove(Company company) {

}

}

客户端:

package com.zyh.designpattern.composite;

public class Client {

public static void main(String[] args) {

// TODO Auto-generated method stub

Company root = new ConcreteCompany();

root.setName("北京总公司");

root.add(new HRDepartment("总公司人力资源部"));

root.add(new FinanceDepartment("总公司财务部"));

Company shandongCom = new ConcreteCompany("山东分公司");

shandongCom.add(new HRDepartment("山东分公司人力资源部"));

shandongCom.add(new FinanceDepartment("山东分公司账务部"));

Company zaozhuangCom = new ConcreteCompany("枣庄办事处");

zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));

zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));

Company jinanCom = new ConcreteCompany("济南办事处");

jinanCom.add(new FinanceDepartment("济南办事处财务部"));

jinanCom.add(new HRDepartment("济南办事处人力资源部"));

shandongCom.add(jinanCom);

shandongCom.add(zaozhuangCom);

Company huadongCom = new ConcreteCompany("上海华东分公司");

huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));

huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));

Company hangzhouCom = new ConcreteCompany("杭州办事处");

hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));

hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));

Company nanjingCom = new ConcreteCompany("南京办事处");

nanjingCom.add(new FinanceDepartment("南京办事处财务部"));

nanjingCom.add(new HRDepartment("南京办事处人力资源部"));

huadongCom.add(hangzhouCom);

huadongCom.add(nanjingCom);

root.add(shandongCom);

root.add(huadongCom);

root.display(0);

}

}

基于C 的样例:

//Menu.h

#include

class Menu

{

public:

virtual ~Menu();

virtual void Add(Menu*);

virtual void Remove(Menu*);

virtual Menu* GetChild(int);

virtual void Display() = 0;

protected:

Menu();

Menu(std::string);

std::string m_strName;

};

//Menu.cpp

#include "stdafx.h"

#include "Menu.h"

Menu::Menu()

{

}

Menu::Menu(std::string strName) : m_strName(strName)

{

}

Menu::~Menu()

{

}

void Menu::Add(Menu* pMenu)

{}

void Menu::Remove(Menu* pMenu)

{}

Menu* Menu::GetChild(int index)

{

return NULL;

}

//SubMenu.h

#include "Menu.h"

class SubMenu : public Menu

{

public:

SubMenu();

SubMenu(std::string);

virtual ~SubMenu();

void Display();

};

//SubMenu.cpp

#include "stdafx.h"

#include "SubMenu.h"

#include

using namespace std;

SubMenu::SubMenu()

{

}

SubMenu::SubMenu(string strName) : Menu(strName)

{

}

SubMenu::~SubMenu()

{

}

void SubMenu::Display()

{

cout << m_strName << endl;

}

//CompositMenu.h

#include "Menu.h"

#include

class CompositMenu : public Menu

{

public:

CompositMenu();

CompositMenu(std::string);

virtual ~CompositMenu();

void Add(Menu*);

void Remove(Menu*);

Menu* GetChild(int);

void Display();

private:

std::vector m_vMenu;

};

//CompositMenu.cpp

#include "stdafx.h"

#include "CompositMenu.h"

#include

using namespace std;

CompositMenu::CompositMenu()

{

}

CompositMenu::CompositMenu(string strName) : Menu(strName)

{

}

CompositMenu::~CompositMenu()

{

}

void CompositMenu::Add(Menu* pMenu)

{

m_vMenu.push_back(pMenu);

}

void CompositMenu::Remove(Menu* pMenu)

{

m_vMenu.erase(&pMenu);

}

Menu* CompositMenu::GetChild(int index)

{

return m_vMenu[index];

}

void CompositMenu::Display()

{

cout << " " << m_strName << endl;

vector ::iterator it = m_vMenu.begin();

for (; it != m_vMenu.end(); it)

{

cout << "|-";

(*it)->Display();

}

}

#include "stdafx.h"

#include "Menu.h"

#include "SubMenu.h"

#include "CompositMenu.h"

int main(int argc, char* argv[])

{

Menu* pMenu = new CompositMenu("国内新闻");

pMenu->Add(new SubMenu("时事新闻"));

pMenu->Add(new SubMenu("社会新闻"));

pMenu->Display();

pMenu = new CompositMenu("国际新闻");

pMenu->Add(new SubMenu("国际要闻"));

pMenu->Add(new SubMenu("环球视野"));

pMenu->Display();

return 0;

}2100433B

组合模式组合模式概述常见问题

组合模式组合模式概述文献

企业项目组合管理模式研究 企业项目组合管理模式研究

格式:pdf

大小:110KB

页数: 1页

评分: 4.5

项目组合管理是一种新的管理思想,它是随着社会和项目管理的不断发展而产生的,本文将项目组合管理与项目管理进行对比,显示出项目组合管理具有明显的优势。根据项目组合管理的特点,本文构建了项目组合管理流程模型,并对各阶段进行了阐述。

立即下载
风冷热泵组合运行除霜模式研究 风冷热泵组合运行除霜模式研究

格式:pdf

大小:110KB

页数: 3页

评分: 4.7

针对某些高湿地区冬季风冷热泵结霜严重的问题,提出了一种新的热泵除霜运行模式一组合运行除霜模式,并对在该模式下热泵机组的稳定运行性能和节能特点进行了分析;计算分析表明:采用组合运行除霜模式可以提高热泵运行的经济性、低温环境下热泵机组供热的稳定性和供热舒适度。

立即下载

组合模式或组合振动。},il}iriatior} rnodr:s。:c:}mbiri tiaiivi E}rativn、在红外光谱中通常出现很多的弱吸收,组合模式或组合振动系指对应于两个或多个基本振动频率之和起源,它的弱吸收于多原子分子振动态相坛作夕}J的振了的非i皆f'}与基频振动及倍频所引起的吸收相比,这些吸收是比r}弱的

2100433B

《组合折腹桥梁设计模式指南》是作者刘玉擎、陈艾荣对组合折腹桥梁研究和实践成果的总结。为了能够具有条理性、系统性地论述组合折腹桥梁的设计方法,基于现行行业标准的编制原则和基本要求,以指南正文和条文说明相结合的方式构建了设计模式指南,并以附录的形式给出了设计算例和国内外几座桥梁设计与施工的实例。

《组合折腹桥梁设计模式指南》可供从事桥梁工程设计、施工和科研等工作的人员参考,也可供相关专业的研究生查用。

Lab模式介绍

是由国际照明委员会(CIE)于1976年公布的一种色彩模式。

RGB模式是一种发光屏幕的加色模式,CMYK模式是一种颜色反光的印刷减色模式。而Lab模式既不依赖光线,也不依赖于颜料,它是CIE组织确定的一个理论上包括了人眼可以看见的所有色彩的色彩模式。

Lab模式组成

弥补了RGB和CMYK两种色彩模式的不足。

Lab模式由三个通道组成,但不是R、G、B通道。它的一个通道是明度,即L。另外两个是色彩通道,用A和B来表示。A通道包括的颜色是从深绿色(低亮度值)到灰色(中亮度值)再到亮粉红色(高亮度值);B通道则是从深蓝色(低亮度值)到灰色(中亮度值)再到黄色(高亮度值)。因此,这种色彩混合后将产生明亮的色彩。

组合模式相关推荐
  • 相关百科
  • 相关知识
  • 相关专栏