четверг, 6 февраля 2014 г.

Компоновщик(Composite)

Компонует объекты в древовидные структуры для представления иерархии часть-целое

#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <stdio.h>
#include <list>
#include <iostream>
#include <string.h>

using namespace std;


class Element
{
public:
  virtual ~Element() {}
  virtual void Print() = 0;
};

class Compositing : public Element
{
public:
  virtual ~Compositing() {}
    virtual void Print()
  {
    for (list<Element*>::iterator it = children.begin();
         it != children.end();
         ++it)
    {
      (*it)->Print();
    }
  }
    void Add(Element* ptr)
  {
    children.push_back(ptr);
  }
  void Remove(Element* ptr)
  {
    children.remove(ptr);
  }
private:
  list<Element*> children;
};

class Directory : public Element
{
public:
  Directory(const char* name) : dir_name(name) {}
  virtual ~Directory() {}
  virtual void Print()
  {
    cout << dir_name << " DIR" << endl;

    DIR *dir = opendir(dir_name);
    if(dir)
    {
      struct dirent *ent;
      while((ent = readdir(dir)) != NULL)
      {
        if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, ".."))
        {
          cout <<"    " << ent->d_name;

        if (strcmp(ent->d_name, " ") && strchr(ent->d_name,'.'))
          cout << " FILE" << endl;
        else
          cout << " DIR" << endl;
        }
      }
    }
    else
    {
      fprintf(stderr, "Error opening directory\n");
    }
    closedir(dir);
  }
  private:
    const char* dir_name;
};

class File : public Element
{
public:
  File(const char* name) : file_name(name) {}
  virtual ~File() {}
  virtual void Print()
  {
    cout << file_name << " FILE" << endl;
  }
private:
  const char* file_name;

};

int main(void)
{

  Compositing comp;

  Element* file = new File("composite.cpp");
  Element* dir = new Directory(".");


  Compositing* c2 = new Compositing;
  c2->Add(dir);
  cout << endl;
  comp.Add(file);
  comp.Add(c2);
  comp.Add(file);

  comp.Print();

  return 0;
}

Комментариев нет:

Отправить комментарий