设计模式之组合模式

10/22/2012 8:20:39 AM

名称:组合模式

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

     适用环境:

     1、你想表示对象的部分-整体层次结构。

     2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

    abstractclassComponent

    {

        protectedstringname;

 

        publicComponent(stringname)

        {

            this.name = name;

        }

        publicabstractvoidAdd(Componentc);

        publicabstractvoidRemove(Componentc);

        publicabstractvoidDisplay(intdepth);

    }

    classComposite: Component

    {

        privateList<Component> _children = newList<Component>();

        publicComposite(stringname)

            : base(name)

        {

        }

        publicoverridevoidAdd(Componentcomponent)

        {

            _children.Add(component);

        }

        publicoverridevoidRemove(Componentcomponent)

        {

            _children.Remove(component);

        }

        publicoverridevoidDisplay(intdepth)

        {

            Console.WriteLine(newstring('-', depth) + name);

            foreach(Componentcomponent in_children)

            {

                component.Display(depth + 2);

 

            }

        }

    }

    classLeaf: Component

    {

        publicLeaf(stringname)

            : base(name)

        {

        }

        publicoverridevoidAdd(Componentc)

        {

            Console.WriteLine("Cannot add to a leaf");

        }

        publicoverridevoidRemove(Componentc)

        {

            Console.WriteLine("Cannot remove from a leaf");

        }

        publicoverridevoidDisplay(intdepth)

        {

            Console.WriteLine(newstring('-', depth) + name);

        }

}

调用:

Compositeroot = newComposite("root");

            root.Add(newLeaf("Leaf A"));

            root.Add(newLeaf("Leaf B"));

 

            Compositecomp = newComposite("Composite X");

            comp.Add(newLeaf("Leaf XA"));

            comp.Add(newLeaf("Leaf XB"));

 

            root.Add(comp);

            root.Add(newLeaf("Leaf C"));

 

            //add and remove a leaf

            Leafleaf = newLeaf("Leaf D");

            root.Add(leaf);

            root.Remove(leaf);

            root.Display(1);

 

输出:

-root

---Leaf A

---Leaf B

---Composite X

-----Leaf XA

-----Leaf XB

---Leaf C