C++디자인 모드 의 조합 모드(Composite)

조합 모델 은 분기 포함 관 계 를 묘사 하기 위해 서,즉 우리 가 말 하 는 나무 형 관 계 를 묘사 하기 위해 서 그 대상 은 가지 와 잎 으로 나 뉘 는데,모든 가 지 는 가지 와 잎 을 포함 하여 모두 잎 노드 가 될 때 까지 포함한다.우 리 는 가지 와 잎 에 대해 추상 적 인 행 위 를 하 는데 가지 와 잎 은 모두 Component 이 고 잎 은 가장 작은 조작 단원 이 며 그 아래 에는 가지 와 잎 이 존재 하지 않 으 며 가 지 는 Composite 안에 그 아래 가지 와 잎 이 있 는 구성 요소 목록 이 라 고 볼 수 있다.
역할.
대상 을 트 리 구조 로 조합 하여'부분-전체'의 차원 구 조 를 나타 내 고 사용자 가 단일 대상 과 조합 대상 에 대한 사용 이 일치 하도록 한다.
클래스 보기

이루어지다

#include <iostream>
#include <list>
#include <string>
using namespace std;
class menu
{
public:
  menu(string in) : name(in){}
  ~menu(){}
  virtual void Add(menu*) = 0;
  virtual void Remove(menu*) = 0;
  virtual void showname() = 0;
protected:
  string name;
};

class Leafmenu : public menu
{
public:
  Leafmenu(string in) : menu(in){}
  ~Leafmenu(){}
  void showname()
  {
    cout<< "Leaf : " << name << endl;
  }
  virtual void Add(menu*){}
  virtual void Remove(menu*){}
};

class Compositemenu : public menu
{
public:
  Compositemenu(string in) : menu(in){}
  void showname()
  {
    cout<< "Composit : "<< name << endl;
    list<menu*>::iterator iter = m_child.begin();
    while (iter != m_child.end())
    {
      (*iter)->showname();
      iter++;
    }
  }
  virtual void Add(menu*m){ m_child.push_back(m); }
  virtual void Remove(menu*m){ m_child.remove(m); }
private:
  list<menu*> m_child;
};
//    
int main
{
  Compositemenu mainmenu("Main");

  /***  File  ****/
  Compositemenu *pFile = new Compositemenu("File");
  Leafmenu *pNew = new Leafmenu("New");
  Leafmenu *pOpen = new Leafmenu("Open");
  Leafmenu *pClose = new Leafmenu("Close");
  pFile->Add(pNew);
  pFile->Add(pOpen);
  pFile->Add(pClose);
  mainmenu.Add(pFile);

  /***  Edit  ****/
  Compositemenu *pEdit = new Compositemenu("Edit");
  Leafmenu *pCopy = new Leafmenu("Copy");
  Leafmenu *pPaste = new Leafmenu("Paste");
  pEdit->Add(pCopy);
  pEdit->Add(pPaste);
  mainmenu.Add(pFile);

  Leafmenu *pExit = new Leafmenu("Exit");
  Leafmenu *pHelp = new Leafmenu("Help");
  mainmenu.Add(pExit);
  mainmenu.Add(pHelp);

  mainmenu.showname();

  delete pNew;
  delete pOpen;
  delete pClose;
  delete pFile;
  delete pCopy;
  delete pPaste;
  delete pEdit;
  delete pExit;
  delete pHelp;
}


잎 이 노드 에 대한 조작 방법,예 를 들 어 상기 예 에서 add,remove,get 등 은 필요 하지 않 습 니 다.기본 클래스 가 밝 힌 것 은 순 허 함수 이기 때문에 반드시 실현 해 야 합 니 다.그러나 호출 할 때 아무런 의미 가 없 기 때문에 사용 하 는 위험 을 가 져 왔 습 니 다.안전 한 방법 은 이런 조작 을 기본 클래스 에서 제거 하고 coposite 류 에 추가 하 는 것 입 니 다.이렇게 하면 컴 파일 할 때 호출 문 제 를 검사 할 수 있 지만 이렇게 하면 인터페이스의 일치 성 을 방해 하고 이해득실 을 따 지 는 선택 은 자신 이 필요 에 따라 해 야 한다.
응용 장면
파일 구조,메뉴,조직 구조 등 자주 사용 되 는 트 리 구조 작업
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기