組合模式(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ì)象。
組合模式解耦了客戶程序與復(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
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
結(jié)算模式,你這個(gè)說(shuō)法好象不嚴(yán)謹(jǐn),結(jié)算是用清單形式還是用定額計(jì)算形式,無(wú)非是這兩種形式。投標(biāo)模式也是清單計(jì)價(jià)模式。如果要改成定額計(jì)價(jià)模式,就要重新以定額模式建立工程,可以將原清單中的定額子目逐個(gè)復(fù)制過(guò)來(lái)...
燈箱按情景模式施工:營(yíng)業(yè)模式、 非營(yíng)業(yè)模式、夜間模式
就計(jì)算燈箱個(gè)數(shù)就行,就像買手機(jī),手機(jī)有振動(dòng)模式、響鈴模式等,這些只是它的功能。
注意過(guò)程中 保存 。
格式: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)行了闡述。
格式: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è)的研究生查用。
是由國(guó)際照明委員會(huì)(CIE)于1976年公布的一種色彩模式。
RGB模式是一種發(fā)光屏幕的加色模式,CMYK模式是一種顏色反光的印刷減色模式。而Lab模式既不依賴光線,也不依賴于顏料,它是CIE組織確定的一個(gè)理論上包括了人眼可以看見的所有色彩的色彩模式。
彌補(bǔ)了RGB和CMYK兩種色彩模式的不足。
Lab模式由三個(gè)通道組成,但不是R、G、B通道。它的一個(gè)通道是明度,即L。另外兩個(gè)是色彩通道,用A和B來(lái)表示。A通道包括的顏色是從深綠色(低亮度值)到灰色(中亮度值)再到亮粉紅色(高亮度值);B通道則是從深藍(lán)色(低亮度值)到灰色(中亮度值)再到黃色(高亮度值)。因此,這種色彩混合后將產(chǎn)生明亮的色彩。