中文名 | 組合模式 | 外文名 | Composite Pattern |
---|---|---|---|
適用性 | 想表示對象的部分-整體層次結(jié)構(gòu) | 類????別 | 軟件設(shè)計模式 |
組合模式解耦了客戶程序與復(fù)雜元素內(nèi)部結(jié)構(gòu),從而使客戶程序可以像處理簡單元素一樣來處理復(fù)雜元素。
如果你想要創(chuàng)建層次結(jié)構(gòu),并可以在其中以相同的方式對待所有元素,那么組合模式就是最理想的選擇。本章使用了一個文件系統(tǒng)的例子來舉例說明了組合模式的用途。在這個例子中,文件和目錄都執(zhí)行相同的接口,這是組合模式的關(guān)鍵。通過執(zhí)行相同的接口,你就可以用相同的方式對待文件和目錄,從而實(shí)現(xiàn)將文件或者目錄儲存為目錄的子級元素。
基于Java的樣例:
比如現(xiàn)實(shí)中公司內(nèi)各部門的層級關(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
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);
}
}
兩個葉結(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("總公司財務(wù)部"));
Company shandongCom = new ConcreteCompany("山東分公司");
shandongCom.add(new HRDepartment("山東分公司人力資源部"));
shandongCom.add(new FinanceDepartment("山東分公司賬務(wù)部"));
Company zaozhuangCom = new ConcreteCompany("棗莊辦事處");
zaozhuangCom.add(new FinanceDepartment("棗莊辦事處財務(wù)部"));
zaozhuangCom.add(new HRDepartment("棗莊辦事處人力資源部"));
Company jinanCom = new ConcreteCompany("濟(jì)南辦事處");
jinanCom.add(new FinanceDepartment("濟(jì)南辦事處財務(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("杭州辦事處財務(wù)部"));
hangzhouCom.add(new HRDepartment("杭州辦事處人力資源部"));
Company nanjingCom = new ConcreteCompany("南京辦事處");
nanjingCom.add(new FinanceDepartment("南京辦事處財務(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
組合模式(Composite Pattern)
組合模式使得用戶對單個對象和組合對象的使用具有一致性。
有時候又叫做部分-整體模式,它使我們樹型結(jié)構(gòu)的問題中,模糊了簡單元素和復(fù)雜元素的概念,客戶程序可以像處理簡單元素一樣來處理復(fù)雜元素,從而使得客戶程序與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。
組合模式讓你可以優(yōu)化處理遞歸或分級數(shù)據(jù)結(jié)構(gòu)。有許多關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的例子,使得組合模式非常有用武之地。關(guān)于分級數(shù)據(jù)結(jié)構(gòu)的一個普遍性的例子是你每次使用電腦時所遇到的:文件系統(tǒng)。文件系統(tǒng)由目錄和文件組成。每個目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計算機(jī)的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來組織的。如果你想要描述這樣的數(shù)據(jù)結(jié)構(gòu),那么你可以使用組合模式Composite。
定義
(GoF《設(shè)計模式》):將對象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和組合對象的使用具有一致性。
涉及角色:
1.Component 是組合中的對象聲明接口,在適當(dāng)?shù)那闆r下,實(shí)現(xiàn)所有類共有接口的默認(rèn)行為。聲明一個接口用于訪問和管理Component子部件。
2.Leaf 在組合中表示葉子結(jié)點(diǎn)對象,葉子結(jié)點(diǎn)沒有子結(jié)點(diǎn)。
3.Composite 定義有枝節(jié)點(diǎn)行為,用來存儲子部件,在Component接口中實(shí)現(xiàn)與子部件有關(guān)操作,如增加(add)和刪除(remove)等。
適用性
以下情況下適用Composite模式:
1.你想表示對象的部分-整體層次結(jié)構(gòu)
2.你希望用戶忽略組合對象與單個對象的不同,用戶將統(tǒng)一地使用組合結(jié)構(gòu)中的所有對象。
結(jié)算模式,你這個說法好象不嚴(yán)謹(jǐn),結(jié)算是用清單形式還是用定額計算形式,無非是這兩種形式。投標(biāo)模式也是清單計價模式。如果要改成定額計價模式,就要重新以定額模式建立工程,可以將原清單中的定額子目逐個復(fù)制過來...
燈箱按情景模式施工:營業(yè)模式、 非營業(yè)模式、夜間模式
就計算燈箱個數(shù)就行,就像買手機(jī),手機(jī)有振動模式、響鈴模式等,這些只是它的功能。
格式:pdf
大?。?span id="axxxkwu" class="single-tag-height">110KB
頁數(shù): 1頁
評分: 4.5
項目組合管理是一種新的管理思想,它是隨著社會和項目管理的不斷發(fā)展而產(chǎn)生的,本文將項目組合管理與項目管理進(jìn)行對比,顯示出項目組合管理具有明顯的優(yōu)勢。根據(jù)項目組合管理的特點(diǎn),本文構(gòu)建了項目組合管理流程模型,并對各階段進(jìn)行了闡述。
格式:pdf
大?。?span id="pdn2x7b" class="single-tag-height">110KB
頁數(shù): 3頁
評分: 4.7
針對某些高濕地區(qū)冬季風(fēng)冷熱泵結(jié)霜嚴(yán)重的問題,提出了一種新的熱泵除霜運(yùn)行模式一組合運(yùn)行除霜模式,并對在該模式下熱泵機(jī)組的穩(wěn)定運(yùn)行性能和節(jié)能特點(diǎn)進(jìn)行了分析;計算分析表明:采用組合運(yùn)行除霜模式可以提高熱泵運(yùn)行的經(jīng)濟(jì)性、低溫環(huán)境下熱泵機(jī)組供熱的穩(wěn)定性和供熱舒適度。
組合模式或組合振動。},il}iriatior} rnodr:s。:c:}mbiri tiaiivi E}rativn、在紅外光譜中通常出現(xiàn)很多的弱吸收,組合模式或組合振動系指對應(yīng)于兩個或多個基本振動頻率之和起源,它的弱吸收于多原子分子振動態(tài)相壇作夕}J的振了的非i皆f'}與基頻振動及倍頻所引起的吸收相比,這些吸收是比r}弱的
2100433B
《組合折腹橋梁設(shè)計模式指南》是作者劉玉擎、陳艾榮對組合折腹橋梁研究和實(shí)踐成果的總結(jié)。為了能夠具有條理性、系統(tǒng)性地論述組合折腹橋梁的設(shè)計方法,基于現(xiàn)行行業(yè)標(biāo)準(zhǔn)的編制原則和基本要求,以指南正文和條文說明相結(jié)合的方式構(gòu)建了設(shè)計模式指南,并以附錄的形式給出了設(shè)計算例和國內(nèi)外幾座橋梁設(shè)計與施工的實(shí)例。
《組合折腹橋梁設(shè)計模式指南》可供從事橋梁工程設(shè)計、施工和科研等工作的人員參考,也可供相關(guān)專業(yè)的研究生查用。
是由國際照明委員會(CIE)于1976年公布的一種色彩模式。
RGB模式是一種發(fā)光屏幕的加色模式,CMYK模式是一種顏色反光的印刷減色模式。而Lab模式既不依賴光線,也不依賴于顏料,它是CIE組織確定的一個理論上包括了人眼可以看見的所有色彩的色彩模式。
彌補(bǔ)了RGB和CMYK兩種色彩模式的不足。
Lab模式由三個通道組成,但不是R、G、B通道。它的一個通道是明度,即L。另外兩個是色彩通道,用A和B來表示。A通道包括的顏色是從深綠色(低亮度值)到灰色(中亮度值)再到亮粉紅色(高亮度值);B通道則是從深藍(lán)色(低亮度值)到灰色(中亮度值)再到黃色(高亮度值)。因此,這種色彩混合后將產(chǎn)生明亮的色彩。