組合模式(Composite Pattern)

組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

有時(shí)候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。

組合模式讓你可以優(yōu)化處理遞歸或分級(jí)數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級(jí)數(shù)據(jù)結(jié)構(gòu)的一個(gè)普遍性的例子是你每次使用電腦時(shí)所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個(gè)目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計(jì)算機(jī)的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來(lái)組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),那么你可以使用組合模式Composite。

定義

(GoF《設(shè)計(jì)模式》):將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。

涉及角色:

1.Component 是組合中的對(duì)象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為。聲明一個(gè)接口用于訪問和管理Component子部件。

2.Leaf 在組合中表示葉子結(jié)點(diǎn)對(duì)象,葉子結(jié)點(diǎn)沒有子結(jié)點(diǎn)。

3.Composite 定義有枝節(jié)點(diǎn)行為,用來(lái)存儲(chǔ)子部件,在Component接口中實(shí)現(xiàn)與子部件有關(guān)操作,如增加(add)和刪除(remove)等。

適用性

以下情況下適用Composite模式:

1.你想表示對(duì)象的部分-整體層次結(jié)構(gòu)

2.你希望用戶忽略組合對(duì)象與單個(gè)對(duì)象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對(duì)象。

組合模式造價(jià)信息

市場(chǎng)價(jià) 信息價(jià) 詢價(jià)
材料名稱 規(guī)格/型號(hào) 市場(chǎng)價(jià)
(除稅)
工程建議價(jià)
(除稅)
行情 品牌 單位 稅率 供應(yīng)商 報(bào)價(jià)日期
模數(shù)式伸縮縫 C40 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 E40 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 Z80 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 E80 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 F40 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 Z40 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 C80 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
模數(shù)式伸縮縫 F80 查看價(jià)格 查看價(jià)格

OVM

m 13% 柳州東方工程橡膠制品有限公司
材料名稱 規(guī)格/型號(hào) 除稅
信息價(jià)
含稅
信息價(jià)
行情 品牌 單位 稅率 地區(qū)/時(shí)間
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年2季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2011年4季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2011年1季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 廣州市2010年3季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 廣州市2009年3季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2009年3季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2009年1季度信息價(jià)
組合烘箱 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2008年3季度信息價(jià)
材料名稱 規(guī)格/需求量 報(bào)價(jià)數(shù) 最新報(bào)價(jià)
(元)
供應(yīng)商 報(bào)價(jià)地區(qū) 最新報(bào)價(jià)時(shí)間
情景模式 根據(jù)不同情景模式設(shè)置多系統(tǒng)控制設(shè)備的指令集合|1項(xiàng) 3 查看價(jià)格 霍尼韋爾(中國(guó))有限公司 廣東   2021-06-18
體感互動(dòng)識(shí)別模式 支持單人識(shí)別模式|2套 1 查看價(jià)格 北京華創(chuàng)盛遠(yuǎn)科技有限公司 全國(guó)   2022-08-10
體感互動(dòng)識(shí)別模式 支持單人識(shí)別模式|2套 1 查看價(jià)格 廣州恒納文化創(chuàng)意有限公司 全國(guó)   2022-10-24
體感互動(dòng)識(shí)別模式 支持單人識(shí)別模式|2套 2 查看價(jià)格 安徽東一特電子技術(shù)有限公司 全國(guó)   2022-09-21
模式管理模塊 提供控制邏輯或運(yùn)行模式編輯功能,|1套 1 查看價(jià)格 施耐德電氣(中國(guó))投資有限公司 全國(guó)   2018-11-30
模式龍頭 寶龍056|9512套 1 查看價(jià)格 寶龍衛(wèi)浴 廣東  陽(yáng)江市 2015-10-30
J40|4只 1 查看價(jià)格 成都市三宇儀表科技發(fā)展有限公司 四川  成都市 2011-12-13
模式小便閥 C-05|6791件 1 查看價(jià)格 佛山市法恩潔具有限公司廣州辦事處 廣東  廣州市 2015-08-10

組合模式解耦了客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素。

如果你想要?jiǎng)?chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對(duì)待所有元素,那么組合模式就是最理想的選擇。本章使用了一個(gè)文件系統(tǒng)的例子來(lái)舉例說(shuō)明了組合模式的用途。在這個(gè)例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關(guān)鍵。通過(guò)執(zhí)行相同的接口,你就可以用相同的方式對(duì)待文件和目錄,從而實(shí)現(xiàn)將文件或者目錄儲(chǔ)存為目錄的子級(jí)元素。

基于Java的樣例:

比如現(xiàn)實(shí)中公司內(nèi)各部門的層級(jí)關(guān)系

抽象接口類:

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);

}

枝結(jié)點(diǎn)類:

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);

}

}

兩個(gè)葉結(jié)點(diǎn)類:

------------------------- 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("總公司財(cái)務(wù)部"));

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

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

shandongCom.add(new FinanceDepartment("山東分公司賬務(wù)部"));

Company zaozhuangCom = new ConcreteCompany("棗莊辦事處");

zaozhuangCom.add(new FinanceDepartment("棗莊辦事處財(cái)務(wù)部"));

zaozhuangCom.add(new HRDepartment("棗莊辦事處人力資源部"));

Company jinanCom = new ConcreteCompany("濟(jì)南辦事處");

jinanCom.add(new FinanceDepartment("濟(jì)南辦事處財(cái)務(wù)部"));

jinanCom.add(new HRDepartment("濟(jì)南辦事處人力資源部"));

shandongCom.add(jinanCom);

shandongCom.add(zaozhuangCom);

Company huadongCom = new ConcreteCompany("上海華東分公司");

huadongCom.add(new HRDepartment("上海華東分公司人力資源部"));

huadongCom.add(new FinanceDepartment("上海華東分公司賬務(wù)部"));

Company hangzhouCom = new ConcreteCompany("杭州辦事處");

hangzhouCom.add(new FinanceDepartment("杭州辦事處財(cái)務(wù)部"));

hangzhouCom.add(new HRDepartment("杭州辦事處人力資源部"));

Company nanjingCom = new ConcreteCompany("南京辦事處");

nanjingCom.add(new FinanceDepartment("南京辦事處財(cái)務(wù)部"));

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("國(guó)內(nèi)新聞");

pMenu->Add(new SubMenu("時(shí)事新聞"));

pMenu->Add(new SubMenu("社會(huì)新聞"));

pMenu->Display();

pMenu = new CompositMenu("國(guó)際新聞");

pMenu->Add(new SubMenu("國(guó)際要聞"));

pMenu->Add(new SubMenu("環(huán)球視野"));

pMenu->Display();

return 0;

}2100433B

組合模式組合模式概述常見問題

組合模式組合模式概述文獻(xiàn)

企業(yè)項(xiàng)目組合管理模式研究 企業(yè)項(xiàng)目組合管理模式研究

格式:pdf

大?。?span id="6zlgtgk" class="single-tag-height">110KB

頁(yè)數(shù): 1頁(yè)

評(píng)分: 4.5

項(xiàng)目組合管理是一種新的管理思想,它是隨著社會(huì)和項(xiàng)目管理的不斷發(fā)展而產(chǎn)生的,本文將項(xiàng)目組合管理與項(xiàng)目管理進(jìn)行對(duì)比,顯示出項(xiàng)目組合管理具有明顯的優(yōu)勢(shì)。根據(jù)項(xiàng)目組合管理的特點(diǎn),本文構(gòu)建了項(xiàng)目組合管理流程模型,并對(duì)各階段進(jìn)行了闡述。

立即下載
風(fēng)冷熱泵組合運(yùn)行除霜模式研究 風(fēng)冷熱泵組合運(yùn)行除霜模式研究

格式:pdf

大?。?span id="2snve2d" class="single-tag-height">110KB

頁(yè)數(shù): 3頁(yè)

評(píng)分: 4.7

針對(duì)某些高濕地區(qū)冬季風(fēng)冷熱泵結(jié)霜嚴(yán)重的問題,提出了一種新的熱泵除霜運(yùn)行模式一組合運(yùn)行除霜模式,并對(duì)在該模式下熱泵機(jī)組的穩(wěn)定運(yùn)行性能和節(jié)能特點(diǎn)進(jìn)行了分析;計(jì)算分析表明:采用組合運(yùn)行除霜模式可以提高熱泵運(yùn)行的經(jīng)濟(jì)性、低溫環(huán)境下熱泵機(jī)組供熱的穩(wěn)定性和供熱舒適度。

立即下載

組合模式或組合振動(dòng)。},il}iriatior} rnodr:s。:c:}mbiri tiaiivi E}rativn、在紅外光譜中通常出現(xiàn)很多的弱吸收,組合模式或組合振動(dòng)系指對(duì)應(yīng)于兩個(gè)或多個(gè)基本振動(dòng)頻率之和起源,它的弱吸收于多原子分子振動(dòng)態(tài)相壇作夕}J的振了的非i皆f'}與基頻振動(dòng)及倍頻所引起的吸收相比,這些吸收是比r}弱的

2100433B

《組合折腹橋梁設(shè)計(jì)模式指南》是作者劉玉擎、陳艾榮對(duì)組合折腹橋梁研究和實(shí)踐成果的總結(jié)。為了能夠具有條理性、系統(tǒng)性地論述組合折腹橋梁的設(shè)計(jì)方法,基于現(xiàn)行行業(yè)標(biāo)準(zhǔn)的編制原則和基本要求,以指南正文和條文說(shuō)明相結(jié)合的方式構(gòu)建了設(shè)計(jì)模式指南,并以附錄的形式給出了設(shè)計(jì)算例和國(guó)內(nèi)外幾座橋梁設(shè)計(jì)與施工的實(shí)例。

《組合折腹橋梁設(shè)計(jì)模式指南》可供從事橋梁工程設(shè)計(jì)、施工和科研等工作的人員參考,也可供相關(guān)專業(yè)的研究生查用。

Lab模式介紹

是由國(guó)際照明委員會(huì)(CIE)于1976年公布的一種色彩模式。

RGB模式是一種發(fā)光屏幕的加色模式,CMYK模式是一種顏色反光的印刷減色模式。而Lab模式既不依賴光線,也不依賴于顏料,它是CIE組織確定的一個(gè)理論上包括了人眼可以看見的所有色彩的色彩模式。

Lab模式組成

彌補(bǔ)了RGB和CMYK兩種色彩模式的不足。

Lab模式由三個(gè)通道組成,但不是R、G、B通道。它的一個(gè)通道是明度,即L。另外兩個(gè)是色彩通道,用A和B來(lái)表示。A通道包括的顏色是從深綠色(低亮度值)到灰色(中亮度值)再到亮粉紅色(高亮度值);B通道則是從深藍(lán)色(低亮度值)到灰色(中亮度值)再到黃色(高亮度值)。因此,這種色彩混合后將產(chǎn)生明亮的色彩。

組合模式相關(guān)推薦
  • 相關(guān)百科
  • 相關(guān)知識(shí)
  • 相關(guān)專欄

最新詞條

安徽省政采項(xiàng)目管理咨詢有限公司 數(shù)字景楓科技發(fā)展(南京)有限公司 懷化市人民政府電子政務(wù)管理辦公室 河北省高速公路京德臨時(shí)籌建處 中石化華東石油工程有限公司工程技術(shù)分公司 手持無(wú)線POS機(jī) 廣東合正采購(gòu)招標(biāo)有限公司 上海城建信息科技有限公司 甘肅鑫禾國(guó)際招標(biāo)有限公司 燒結(jié)金屬材料 齒輪計(jì)量泵 廣州采陽(yáng)招標(biāo)代理有限公司河源分公司 高鋁碳化硅磚 博洛尼智能科技(青島)有限公司 燒結(jié)剛玉磚 深圳市東海國(guó)際招標(biāo)有限公司 搭建香蕉育苗大棚 SF計(jì)量單位 福建省中億通招標(biāo)咨詢有限公司 泛海三江 威海鼠尾草 Excel 數(shù)據(jù)處理與分析應(yīng)用大全 廣東國(guó)咨招標(biāo)有限公司 甘肅中泰博瑞工程項(xiàng)目管理咨詢有限公司 山東創(chuàng)盈項(xiàng)目管理有限公司 拆邊機(jī) 當(dāng)代建筑大師 廣西北纜電纜有限公司 大山檳榔 上海地鐵維護(hù)保障有限公司通號(hào)分公司 舌花雛菊 甘肅中維國(guó)際招標(biāo)有限公司 華潤(rùn)燃?xì)猓ㄉ虾#┯邢薰? 湖北鑫宇陽(yáng)光工程咨詢有限公司 GB8163標(biāo)準(zhǔn)無(wú)縫鋼管 中國(guó)石油煉化工程建設(shè)項(xiàng)目部 韶關(guān)市優(yōu)采招標(biāo)代理有限公司 莎草目 建設(shè)部關(guān)于開展城市規(guī)劃動(dòng)態(tài)監(jiān)測(cè)工作的通知 電梯平層準(zhǔn)確度 廣州利好來(lái)電氣有限公司 四川中澤盛世招標(biāo)代理有限公司