zoukankan      html  css  js  c++  java
  • 12结构型模式之组合模式

    概念

      Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。

    角色和职责

    Component (树形结构的节点抽象)

    - 为所有的对象定义统一的接口(公共属性,行为等的定义)

    - 提供管理子节点对象的接口方法

    - [可选]提供管理父节点对象的接口方法

    Leaf (树形结构的叶节点)

    Component的实现子类

    Composite(树形结构的枝节点)

    Component的实现子类

    适用于:

      单个对象和组合对象的使用具有一致性。将对象组合成树形结构以表示“部分--整体”

    案例

    //实现一个目录结构,如下:

    C:

      111dir

        222dir

          222.txt

       aaa.txt   

    #include <iostream>
    using namespace std;
    #include "list"
    #include "string"
    
    //
    class IFile
    {
    public:
    	virtual void display() = 0;
    	virtual int add(IFile *ifile) = 0;
    	virtual int remove(IFile *ifile) = 0;
    	virtual list<IFile *>* getChild() = 0;
    protected:
    private:
    };
    
    class File : public IFile
    {
    public:
    	File(string name)
    	{
    		m_list = NULL;
    		m_name = "";
    		m_name = name;
    	}
    	~File()
    	{
    		if (m_list != NULL)
    		{
    			delete m_list;
    		}
    	}
    	virtual void display()
    	{
    		cout << m_name << endl;
    	}
    	virtual int add(IFile *ifile)
    	{
    		return -1;
    	}
    	virtual int remove(IFile *ifile)
    	{
    		return -1;
    	}
    	virtual list<IFile *>* getChild() 
    	{
    		return NULL;
    	}
    
    private:
    	list<IFile *> *	m_list;
    	string		m_name;
    
    };
    
    class Folder : public IFile
    {
    public:
    	Folder(string name)
    	{
    		m_name = name;
    		m_list = new list<IFile *>;
    	}
    	~Folder()
    	{
    		if (m_list == NULL)
    		{
    			delete m_list;
    		}
    	}
    	virtual void display()
    	{
    		cout << m_name << endl;
    	}
    	virtual int add(IFile *ifile)
    	{
    		m_list->push_back(ifile);
    		return 0;
    	}
    	virtual int remove(IFile *ifile)
    	{
    		m_list->remove(ifile);
    		return 0;
    	}
    	virtual list<IFile *>* getChild() 
    	{
    		return m_list;
    	}
    
    private:
    	list<IFile *> *	m_list;
    	string			m_name;
    
    };
    
    void showTree(IFile *ifile, int level)
    {
    	list<IFile *> *l = NULL;
    	int i = 0;
    	for (i=0; i<level; i++)
    	{
    		printf("	");
    	}
    	ifile->display();
    
    	l = ifile->getChild();
    	if (l != NULL)
    	{
    		for (list<IFile *>::iterator it=l->begin(); it!=l->end(); it++)
    		{
    			if ( (*it)->getChild() == NULL)
    			{
    				for (i=0; i<=level; i++) //注意 <= 
    				{
    					printf("	");
    				}
    				(*it)->display();
    			}
    			else
    			{
    				showTree((*it), level + 1);
    			}
    
    		}
    	}
    }
    
    void main()
    {
    	Folder *root = new Folder("C:");
    
    	Folder *dir1 = new Folder("111dir");
    	File *txt1 = new File("aaa.txt");
    
    	Folder *dir12 = new Folder("222dir");
    	//dir12->display();
    	File *txt12 = new File("222.txt");
    	//txt12->display();
    
    	
    	root->display();
    	root->add(dir1);
    	root->add(txt1);
    
    	dir1->add(dir12);
    	dir1->add(txt12);
    
    	/*
    	list<IFile *> *l = dir1->getChild();
    	for (list<IFile *>::iterator it=l->begin(); it!=l->end(); it++)
    	{
    		(*it)->display();
    	}
    	*/
    	//开发一个递归函数 现在根结点下的所有子结点
    	cout << "测试递归函数" << endl;
    
    	showTree(root, 0);
    
    	delete txt12;
    	delete dir12;
    	delete dir1;
    	delete txt1;
    	delete root;
    	cout<<"hello..."<<endl;
    	system("pause");
    	return ;
    }
    

      

          

  • 相关阅读:
    [GUIDE] How to Setup Ubuntu 16.04 LTS Xenial Xerus for Compiling Android ROMs
    设置Ubuntu 16.04 LTS的Unity启动器的位置命令
    sed系列:行或者模式匹配删除特定行
    HDOJ 4923 Room and Moor
    Office365client通过本地方式批量部署(即点即用部署)
    hdu 1867 A + B for you again
    Photoshop经常使用快捷键(2)
    SQL_为表和列加凝视
    从头认识java-17.5 堵塞队列(以生产者消费者模式为例)
    Unity5 怎样做资源管理和增量更新
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10357982.html
Copyright © 2011-2022 走看看