2014年09月02日

コンポジット

Composite

直訳すると合成とかいう意味。
ツリー構造のような再帰的なデータ構造を表すために使用する。
TreeViewのようなコントロールにDataBindさせるために使ったりしたけれど、LinqToXMLとかあると使う機会は減るか。
若しくはファイルディレクトリのように異なるものを同一のインタフェースを継承(実現)させることにより統一的に扱えるという実装になる。


Sample Code

    // 枝(Node)と葉(Leaf)とが継承(実現)するインタフェース
    public interface INode
    {
        string Name { get; set; }
        IList<INode> Children { get;}
        void Remove(INode node);
        void Add(INode node);
    }
    // インタフェースを継いた抽象クラス
    public abstract class AbstractNode : INode
    {
        public string Name { get; set;}

        public virtual IList<INode> Children
        {
            get { throw new InvalidOperationException(); }
        }

        public virtual void Remove(INode node)
        {
            throw new InvalidOperationException();
        }

        public virtual void Add(INode node)
        {
            throw new InvalidOperationException();
        }
    }
    // 抽象クラスを継承した葉クラス 
    public class Leaf : AbstractNode
    {

    }
    // 抽象クラスを継承した枝クラス
    // 抽象クラス(インタフェース)を直接継承せず葉クラスを継承する場合もあり
    public class Node : AbstractNode
    {
        private IList<INode> _list;

        public Node()
        {
            _list = new List<INode>();
        }

        public override IList<INode> Children
        {
            get{return _list;}
        }

        public override void Add(INode node)
        {
            _list.Add(node);
        }

        public override void Remove(INode node)
        {
            _list.Remove(node);
        }
    }

posted by RR at 00:33 | Comment(0) | デザインパターン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。