布局型模式--组合模式

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

概念

组合人模式是布局型设计模式的一种,重要是用于解决代码中出现类像树一样举行组合而出现的组合布局的相干操作问题。使其树中的任意一个节点(无论是子节点还是父节点)都可以利用同一套接口举行操作。
利用场景

1、如果希望我们对象组合像树一样,就可以利用组合模式
2、客户端的代码必要以相同的方式处理复杂或者简单的元素(组合对象或者单个对象),可以利用组合模式。
实现方式

1、创建一个可以组成树状布局的核心模子(抽象接口类)。实验将其分解为简单的元素和容器,容器必须可以或许同时包罗简单位素和其他容器。
2、声明组件接口及其一系列的方法,这些方法对简单和复杂元素都故意义。
3、创建一个叶节点类的表示元素。
4、创建一个容器类表示复杂元素,在该类中,创建一个数组成员变量来存储对于子元素的引用,该数组必须可以或许同时保持叶节点和容器,因此请确保将其声明为组合接口类型。
5、末了,容器中定义添加和删除子元素的方法。
类组合布局


示例代码

  1. #include <iostream>
  2. #include "ZuHeMoshi.h"
  3. int main()
  4. {
  5.     std::cout << "欢迎东哥来到设计模式的世界!\n";
  6.     //创建叶子节点
  7.     Leaf leaf1;
  8.     leaf1.setTime(2);
  9.     Leaf leaf2;
  10.     leaf2.setTime(2);
  11.     Leaf leaf3;
  12.     leaf3.setTime(2);
  13.     Leaf leaf4;
  14.     leaf4.setTime(2);
  15.     AbstractBase* container1 = new Container();
  16.     container1->addAbstractBase(&leaf1);
  17.     container1->addAbstractBase(&leaf2);
  18.     cout << "container1 time : " << container1->allTime() << endl;
  19.     AbstractBase* container2 = new Container();
  20.     container2->addAbstractBase(&leaf3);
  21.     container2->addAbstractBase(&leaf4);
  22.     container2->addAbstractBase(container1);
  23.     cout << "container2 time : " << container2->allTime() << endl;
  24. }
复制代码
  1. #pragma once
  2. #include <vector>
  3. using namespace std;
  4. class AbstractBase
  5. {
  6. public:
  7.         AbstractBase() {}
  8.         ~AbstractBase() {}
  9.         virtual void addAbstractBase(AbstractBase* abstractBase) {};
  10.         virtual int allTime() { return 0; };//计算所有时间,假设代码中这是需要计算组合或者单个元素的运行时间的函数
  11.         int m_time;
  12. };
  13. class Leaf : public AbstractBase
  14. {
  15. public:
  16.         Leaf() {}
  17.         ~Leaf() {}
  18.         int allTime();
  19.         void setTime(int time) {
  20.                 m_time = time;
  21.         }
  22. private:
  23.         int m_time;
  24. };
  25. class Container : public AbstractBase
  26. {
  27. public:
  28.         Container() {}
  29.         ~Container() {}
  30.         void addAbstractBase(AbstractBase* abstractBase);//暂时就写个添加
  31.         int allTime();
  32. private:
  33.         vector<AbstractBase*> m_vAbstractBase;
  34. };
复制代码
  1. #include "ZuHeMoshi.h"
  2. int Leaf::allTime()
  3. {
  4.     return m_time;
  5. }
  6. void Container::addAbstractBase(AbstractBase* abstractBase)
  7. {
  8.     m_vAbstractBase.push_back(abstractBase);
  9. }
  10. int Container::allTime()
  11. {
  12.     int sun = 0;
  13.     for (AbstractBase* base : m_vAbstractBase) {
  14.         sun += base->allTime();
  15.     }
  16.     return sun;
  17. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表