济南网站开发哪家好,环境建设公司网站,韶关市网站建设,拓者设计官网网页版系列文章目录
C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列
期待你的关注哦#xff01;#xff01;#xff01;
现在的一切都是为将来的梦想编织翅膀#xff0c;让梦想在现实中展翅高飞。 Now everythi…系列文章目录
C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列
期待你的关注哦
现在的一切都是为将来的梦想编织翅膀让梦想在现实中展翅高飞。 Now everything is for the future of dream weaving wings, let the dream fly in reality. 结构型设计模式之组合模式 系列文章目录一、组合模式介绍二、组合模式优缺点2.1 优点2.2 缺点 三、组合模式使用场景四、组合模式实现 一、组合模式介绍
⚠️ 意图 将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
⚠️ 主要解决 它在我们树型结构的问题中模糊了简单元素和复杂元素的概念客户程序可以像处理简单元素一样来处理复杂元素从而使得客户程序与复杂元素的内部结构解耦。
⚠️ 何时使用 1、您想表示对象的部分-整体层次结构树形结构。 2、您希望用户忽略组合对象与单个对象的不同用户将统一地使用组合结构中的所有对象。
⚠️ 如何解决 树枝和叶子实现统一接口树枝内部组合该接口。
现有一个公司需要实现一个广播的功能用来通知给公司所有部门重要的信息。如果需要广播那么必须通过每一个部门类的实例去调用各自部门的广播接口。通过一个抽象类来抽象出广播接口各个部门和公司都通过继承实现抽象接口。如此实现可以将所有部门放在一个容器内遍历实现其广播接口。如果公司不扩大永远有这几个部门并且没有分公司的话是没问题的。如果再要添加一个部门就必须实现一个部门类再修改总公司类。这明显违背了开闭原则。既然我们通过抽象类来实现了其方法那就可以实现抽象的增加删除查询接口。如此一来如果要有新的部门 那么只需要通过调用添加接口来增加新部门 广播的时候只需要遍历容器中的广播接口即可。实现类图如下 图1_1 组合模式类图 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 “组合对象” 的含义。
组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。
二、组合模式优缺点
2.1 优点
简化客户端调用实现符合开闭原则。高层模块调用简单。节点自由增加
2.2 缺点 如果业务逻辑负责则实现组合模式比较困难。 在使用组合模式时其叶子和树枝的声明都是实现类而不是接口违反了依赖倒置原则。
三、组合模式使用场景
适用于“整体-部分”层次的树形结构的。部分、整体场景如树形菜单文件、文件夹的管理。
客户端对组合对象统一的使用所有对象。
四、组合模式实现
Component.h
#ifndef COMPONENTS_H_
#define COMPONENTS_H_#include iostream
#include vectorusing namespace std;class Components
{
public:Components(std::string strName):m_strName(strName){}virtual void Operation() 0;virtual void AddSubCompany(Components* subCompany);virtual void DelSubCompany(Components* subCompany);virtual Components* GetCompanyByIndex(int iIndex);protected:std::string m_strName;
};class ConcreteCompany : public Components
{
public:ConcreteCompany(std::string strName):Components(strName){}~ConcreteCompany();virtual void Operation();virtual void AddSubCompany(Components* subCompany);virtual void DelSubCompany(Components* subCompany);virtual Components* GetCompanyByIndex(int iIndex);
private:std::vectorComponents* m_vecSubItem;
};class FinanceDepartment : public Components
{
public:FinanceDepartment(std::string strName):Components(strName){}virtual void Operation();
};class HRDepartment : public Components
{
public:HRDepartment(std::string strName):Components(strName){}virtual void Operation();
};#endifComponent.cpp
#include Company.h
#include algorithm#ifndef SAFE_DELETE
#define SAFE_DELETE(p){if((p) ! NULL){delete (p); (p) NULL;}}
#endifvoid Components::AddSubCompany( Components* subCompany )
{cout Have no realized! endl;
}void Components::DelSubCompany( Components* subCompany )
{cout Have no realized! endl;
}Components* Components::GetCompanyByIndex( int iIndex )
{cout Have no realized! endl;return NULL;
}//******************//
//**CentralCompany**//
//******************//ConcreteCompany::~ConcreteCompany()
{std::for_each(m_vecSubItem.begin(),m_vecSubItem.end(),[](Components* item){SAFE_DELETE(item);});
}void ConcreteCompany::Operation()
{std::for_each(m_vecSubItem.begin(),m_vecSubItem.end(),[](Components* item){item-Operation();});
}void ConcreteCompany::AddSubCompany( Components* subCompany )
{if (subCompany ! NULL){m_vecSubItem.push_back(subCompany);}
}void ConcreteCompany::DelSubCompany( Components* subCompany )
{for (auto it m_vecSubItem.begin(); it ! m_vecSubItem.end(); it){if ((*it) subCompany){m_vecSubItem.erase(it);SAFE_DELETE(subCompany);break;}}
}Components* ConcreteCompany::GetCompanyByIndex( int iIndex )
{if (iIndex 0 || iIndex m_vecSubItem.size()){return NULL;}return m_vecSubItem[iIndex];
}void FinanceDepartment::Operation()
{cout m_strName.c_str() endl;
}void HRDepartment::Operation()
{cout m_strName.c_str() endl;
}main.cpp
#include iostream
#include Company.husing namespace std;int main()
{Components* Central new ConcreteCompany(Central Company);Central-AddSubCompany(new FinanceDepartment(Central Finance Department));Central-AddSubCompany(new HRDepartment(Central HR Department));Components* Xian new ConcreteCompany(XiAn Company);Xian-AddSubCompany(new FinanceDepartment(XiAn Finance Department));Xian-AddSubCompany(new HRDepartment(XiAn HR Department));Central-AddSubCompany(Xian);Central-Operation();cout endl;Central-DelSubCompany(Xian);Central-Operation();return 0;
}输出
Central Finance DepartmentCentral HR DepartmentXi’An Finance DepartmentXi’An HR DepartmentCentral Finance DepartmentCentral HR Department