设计模式---组合模式
2015-07-10 22:57
393 查看
组合模式是属于结构模式的一种设计方法。首先是定义:
将对象组合成树形结构以表示部分–整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
结构图:
意图
将对象组合成树形结构以表示“部分–整体”的层次结构。Composite使得用户对单个对象和组合对象使用具有一致性。
适用性
1 你想表示对象的部分–整体层次结构
2 你希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象
协作
用户使用Compoment类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给他的子部件,在转发之前或之后可能执行以下辅助操作
优点
1 定义了包含基本对象和组合对象的类层次结构,客户代码中,任何可以使用基本对象的地方都可以用到组合对象
2 简化客户代码。客户可以一致的对待单个对象和组合对象,因此可以不需要写在定义组合对象中充斥着选择语句的函数
3 使得更容易增加新类型的组件
4 使你的设计更加一般化
实现注意的问题
1 显示的父部件引用。通常在Component类中定义父部件引用,可以简化组合结构的便利和管理,Leaf和Composite可以继承这个引用以及管理操作
2 共享组件
3 最大化Component接口
4 声明管理子部件的操作
透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add,remove,这样实现Component的接口的所有子类都具备Add和remove的方法。
安全方式:在Component中不去声明Add和remove方法,子类的leaf不需要实现它,而是在Component声明管理子类对象的方法,不过由于不够透明,客户端的调用需要做一些判断,带来了不便
5 Component是否应该实现一个Component列表
6 子部件排序
7 使用高速缓存提高性能
8 应该由Composite删除它的子节点,但如果leaf不会改变,可以被共享
9 选用哪一种数据结构
公司的架构就可以很好的采用组合方式进行模拟
将对象组合成树形结构以表示部分–整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
结构图:
意图
将对象组合成树形结构以表示“部分–整体”的层次结构。Composite使得用户对单个对象和组合对象使用具有一致性。
适用性
1 你想表示对象的部分–整体层次结构
2 你希望用户忽略组合对象和单个对象的不同,用户将统一的使用组合结构中的所有对象
协作
用户使用Compoment类接口与组合结构中的对象进行交互。如果接受者是一个叶节点,则直接处理请求。如果接受者是Composite,它通常将请求发送给他的子部件,在转发之前或之后可能执行以下辅助操作
优点
1 定义了包含基本对象和组合对象的类层次结构,客户代码中,任何可以使用基本对象的地方都可以用到组合对象
2 简化客户代码。客户可以一致的对待单个对象和组合对象,因此可以不需要写在定义组合对象中充斥着选择语句的函数
3 使得更容易增加新类型的组件
4 使你的设计更加一般化
实现注意的问题
1 显示的父部件引用。通常在Component类中定义父部件引用,可以简化组合结构的便利和管理,Leaf和Composite可以继承这个引用以及管理操作
2 共享组件
3 最大化Component接口
4 声明管理子部件的操作
透明方式:在Component中声明所有用来管理子对象的方法,其中包括Add,remove,这样实现Component的接口的所有子类都具备Add和remove的方法。
安全方式:在Component中不去声明Add和remove方法,子类的leaf不需要实现它,而是在Component声明管理子类对象的方法,不过由于不够透明,客户端的调用需要做一些判断,带来了不便
5 Component是否应该实现一个Component列表
6 子部件排序
7 使用高速缓存提高性能
8 应该由Composite删除它的子节点,但如果leaf不会改变,可以被共享
9 选用哪一种数据结构
公司的架构就可以很好的采用组合方式进行模拟
// Composite.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "ConcretaCompany.h" #include "HRDepartMent.h" #include "FinanceDepartMent.h" int _tmain(int argc, _TCHAR* argv[]) { ConcretaCompany* root = new ConcretaCompany("北京总公司"); root->add(new HRDepartMent("总公司人力部")); root->add(new FinanceDepartMent("总公司财政部")); ConcretaCompany* comp = new ConcretaCompany("上海华东公司"); comp->add(new HRDepartMent("上海华东公司人力部")); comp->add(new FinanceDepartMent("上海华东公司财政部")); root->add(comp); ConcretaCompany* comp1 = new ConcretaCompany("南京办事处"); comp1->add(new HRDepartMent("南京办事处人力部")); comp1->add(new FinanceDepartMent("南京办事处财政部")); root->add(comp1); root->display(); root->lineOfDuty(); return 0; } /************************************************************************ @fileName:Company.h @function: 组合模式中的Component类 @author: jaime @ver: 1.0.0 ************************************************************************/ #pragma once #include <string> using namespace std; class Company { public: Company(string name); ~Company(); virtual void add(Company* c); virtual void remove(Company* c); virtual void display(); virtual void lineOfDuty(); protected: string m_name; }; #include "Company.h" Company::Company(string name) :m_name(name) { } Company::~Company() { } void Company::add(Company* c) { } void Company::remove(Company* c) { } void Company::display() { } void Company::lineOfDuty() { } /************************************************************************ @fileName:ConcretaCompany.h @function: 组合模式中的Composite类 @author: jaime @ver: 1.0.0 ************************************************************************/ #pragma once #include "Company.h" #include <list> #include <string> using namespace std; class ConcretaCompany : public Company { public: ConcretaCompany(string name); ~ConcretaCompany(); virtual void add(Company* c); virtual void remove(Company* c); virtual void display(); virtual void lineOfDuty(); private: list<Company*> m_children; }; #include "ConcretaCompany.h" ConcretaC 4000 ompany::ConcretaCompany(string name) :Company(name) { } ConcretaCompany::~ConcretaCompany() { } void ConcretaCompany::add(Company* c) { m_children.push_back(c); } void ConcretaCompany::remove(Company* c) { m_children.remove(c); } void ConcretaCompany::display() { list<Company*>::iterator it = m_children.begin(); while ( it != m_children.end() ) { (*it)->display(); it++; } } void ConcretaCompany::lineOfDuty() { list<Company*>::iterator it = m_children.begin(); while ( it != m_children.end() ) { (*it)->lineOfDuty(); it++; } } /************************************************************************ @fileName:FinanceDepartMent.h @function: 组合模式中的leaf类,财政部 @author: jaime @ver: 1.0.0 ************************************************************************/ #pragma once #include "Company.h" #include <string> using namespace std; class FinanceDepartMent : public Company { public: FinanceDepartMent(string name); ~FinanceDepartMent(); virtual void display(); virtual void lineOfDuty(); private: }; #include "FinanceDepartMent.h" #include <iostream> using namespace std; FinanceDepartMent::FinanceDepartMent(string name) :Company(name) { } FinanceDepartMent::~FinanceDepartMent() { } void FinanceDepartMent::display() { cout << "财政部" <<m_name<<endl; } void FinanceDepartMent::lineOfDuty() { cout << "收支管理" << endl; } /************************************************************************ @fileName:HRDepartMent.h @function: 组合模式中的leaf类,人力部 @author: jaime @ver: 1.0.0 ************************************************************************/ #pragma once #include "Company.h" #include <string> using namespace std; class HRDepartMent : public Company { public: HRDepartMent(string name); ~HRDepartMent(); virtual void display(); virtual void lineOfDuty(); private: }; #include "HRDepartMent.h" #include <iostream> using namespace std; HRDepartMent::HRDepartMent(string name) :Company(name) { } HRDepartMent::~HRDepartMent() { } void HRDepartMent::display() { cout << "HR" <<m_name<<endl; } void HRDepartMent::lineOfDuty() { cout << "培训" << endl; }
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 架构纵横谈之二 ---- 架构的模式与要点
- 一步一步跟我学易语言之第二个易程序菜单设计
- PostgreSQL教程(二):模式Schema详解
- 代理区独立模式的说明
- C#中的递归APS和CPS模式详解
- C#迭代器模式(Iterator Pattern)实例教程
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- C#观察者模式(Observer Pattern)实例教程
- C#单例模式(Singleton Pattern)实例教程
- C#中设计、使用Fluent API
- Erlang中的模块与模式匹配介绍
- C#装饰器模式(Decorator Pattern)实例教程
- 基于逻辑运算的简单权限系统(原理,设计,实现) VBS 版
- PHP设计模式之装饰者模式代码实例