再帰複合デコレータは、デコレータの新しい構成及びサブクラスを追加することによって操作を意図したという点は相違させて、組成物のツリー構造を構築する設計パターン-Composite(構造モデル)を直接、新しい操作を追加しました。

脱離およびC ++のソースコードを達成するための23個のデザインパターン-GoFファインパターンの設計ソリューション:以下のソースコード

//Component.h

#pragmaかつて

クラスコンポーネント
{
公共
    成分();
    仮想コンポーネント();
    仮想 オペレーション()= 0 ;
    仮想 (追加のconstコンポーネント&);
    仮想 無効(削除のconstコンポーネント&);
    仮想コンポーネント*でGetChild(INT );
保護プライベート

}。

//Component.cpp

#include " Component.h "
成分::成分(){}
コンポーネント::コンポーネント(){}
 のボイド(コンポーネント::追加のconstコンポーネント&COM){}
 のボイド(コンポーネント::削除のconstコンポーネント&COM){}
コンポーネント *コンポーネント::でGetChild(int型のインデックス)
{
    リターン 0 ;
}

//composite.h

#include " Component.h " 
の#include <ベクトル>

クラスコンポジット:公共のコンポーネント
{
公共
    複合();
    仮想コンポジット();
    の追加(コンポーネント* COM)。 
    の削除(コンポーネント* COM)。
    無効操作();
    コンポーネント *でGetChild(int型のインデックス);
保護プライベート
    std ::ベクトル <コンポーネント*> comVec。
}。

//Composite.cpp

#include " Component.h " 
の#include " composite.h "

const  int型 はnull = 0 ;

複合::複合(){}
複合::複合(){}

コンポジット::オペレーション(){
     のため(のstd ::ベクトル<コンポーネント*> ::イテレータ仲間comVec.begin =();!数= comVec.end(); ++ の仲間)
    {アールズ) - > オペレーション();
    }
}
コンポジット::追加(コンポーネント* COM)
{
    comVec.push_back(COM)。
}
コンポジット::削除(コンポーネント* COM)
{
    // comVec.erase(&COM); // ここでの問題を説明しようとしている、そこにあります!
}
コンポーネント *コンポジット::でGetChild(int型のインデックス)
{
    リターンcomVec [インデックス]。
}

//Leaf.h

#include Component.h 
クラスリーフ:公共のコンポーネント
{
公共
    葉();
    仮想リーフ();
    無効操作();
保護プライベート

}。

//Leaf.cpp

#include " Leaf.h " 
の#include <iostreamの>
葉::葉(){
}
リーフ::リーフ(){}
 無効リーフ::オペレーション(){
    std :: coutの << " リーフ操作... " << はstd ::てendl;
}

//main.cpp

#include " Component.h " 
の#include " composite.h " 
の#include " Leaf.h " 
の#include <iostreamの> 
の#include < 文字列 >
 int型のmain(int型の引数、文字 * ARGV)
{
    リーフ * I = 新しいリーフ();
    I - > オペレーション();
    コンポジット * COM = 新しいコンポジット();
    コム - > (I)を追加します。
    コム - > オペレーション();
    成分 * II = COM - >でGetChild(0 )。
    getchar();
    リターン 0 ;
}

おすすめ

転載: www.cnblogs.com/fourmi/p/12077657.html