造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

组合模式示例

2022/07/16109 作者:佚名
导读:基于Java的样例: 比如现实中公司内各部门的层级关系 抽象接口类: package com.zyh.designpattern.composite; public abstract class Company { private String name; public Company(String name) { super(); this.name = name; } public Compa

基于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

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读