zoukankan      html  css  js  c++  java
  • 组合模式

    一、简介

    1、组合模式将对象组合成树形结构以表示‘部分和整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

    2、模式中的几个重要的类

    Component:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为。

    Leaf:叶节点对象,叶节点没有子节点。由于叶节点不能增加分支和树叶,所以叶节点的Add和Remove没有实际意义。

    Composite:实现Componet的相关操作,比如Add和Remove操作。

    3、UML

    4、所属类别:结构型

    二、C++代码

     1 // 组合模式.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 #include<string>
     7 #include<vector>
     8 using namespace std;
     9 
    10 class Component
    11 {
    12 public:
    13     Component(){}
    14     virtual ~Component(){}
    15     virtual void add(Component *)=0;
    16     virtual void remove(Component *)=0;
    17     virtual void display(int jibie)=0;//为了看清楚树形关系而设置的显示函数
    18 };
    19 class Leaf:public Component
    20 {
    21 private:
    22     string name;
    23 public:
    24     Leaf(string n)
    25     {
    26         name=n;
    27     }
    28     ~Leaf(){}
    29     virtual void add(Component* a)
    30     {
    31         cout<<"最底层不能再添加部门"<<endl;
    32     }
    33     virtual void remove(Component* a)
    34     {
    35         cout<<"最底层没有可以删除的部门"<<endl;
    36     }
    37     virtual void display(int jibie)
    38     {
    39         for(int i=0;i<jibie;i++)
    40         {
    41             cout<<'-';
    42         }
    43         cout<<name<<endl;
    44     }
    45 };
    46 class Composite:public Component
    47 {
    48 private:
    49     vector<Component*> com;
    50     string name;
    51 public:
    52     Composite(string n)
    53     {
    54         name=n;
    55     }
    56     virtual ~Composite(){}
    57     virtual void add(Component* a)
    58     {
    59         com.push_back(a);
    60     }
    61     virtual void remove(Component*a)
    62     {
    63         //com.erase(a);
    64     }
    65     virtual void display(int num)
    66     {
    67         for(int i=0;i<num;i++)
    68         {
    69             cout<<'-';
    70         }
    71         cout<<name<<endl;
    72         num=num+2;
    73         vector<Component*>::iterator it;
    74         for(it=com.begin();it!=com.end();it++)
    75         {
    76             (*it)->display(num);
    77         }
    78     }
    79 };
    80 
    81 int _tmain(int argc, _TCHAR* argv[])
    82 {
    83     Component *root=new  Composite("河海大学");
    84     Component *changzhouxiaoqu=new Composite("河海大学常州校区");
    85     Component *wulianwang=new Composite("河海大学常州校区物联网工程学院");
    86     Component *jidiangongcheng=new Composite("河海大学常州校区机电工程学院");
    87     root->add(changzhouxiaoqu);
    88     changzhouxiaoqu->add(wulianwang);
    89     changzhouxiaoqu->add(jidiangongcheng);
    90     root->display(1);
    91     return 0;
    92 }

    注意:程序中63行还是有点错误,暂时没找出来,所以删除函数还不能用。

  • 相关阅读:
    8.11 hdu 多校第五场补题
    8.10 trie树模板
    8.6 edu25 ,577#div2 CF补题(二分 ,dp 与 贪心
    8.4 POJ 3237 (树链剖分+线段树
    8.4 poj 2763 Housewife Wind (树链剖分边权处理
    8.4 树链剖分
    8.3 树链剖分
    2019 hdu 第四场补题 (2
    2019 hdu 第四场补题 (1 ,签到题
    51NOD 1137 矩阵乘法
  • 原文地址:https://www.cnblogs.com/bewolf/p/4249531.html
Copyright © 2011-2022 走看看