组合模式(Composite Pattern):

组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式。

角色模式与结构:

组合模式的关键是定义了一个抽象构件类,它既可以代表叶子,又可以代表容器,而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。

示例代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CSharp.DesignPattern.CompositePattern
{
    class Program
    {
        static void Main(string[] args)
        {
            Component leaf1;
            Component leaf2;

            Component composite1;
            Component composite2;

            leaf1 = new Leaf();
            leaf2 = new Leaf();

            composite1 = new Composite();
            composite2 = new Composite();

            composite2.Add(leaf2);
            composite1.Add(composite2);
            composite1.Add(leaf1);

            composite1.Operation();

            Console.ReadLine();
        }
    }

    // 抽象构件
    abstract class Component
    {
        public abstract void Add(Component c);
        public abstract void Remove(Component c);
        public abstract Component GetChild(int i);
        public abstract void Operation();
    }

    // 叶子节点
    class Leaf : Component
    {
        public override void Add(Component c)
        {
            // 异常处理或错误提示
        }

        public override void Remove(Component c)
        {
            // 异常处理或错误提示
        }

        public override Component GetChild(int i)
        {
            // 异常处理或错误提示
            return null;
        }

        public override void Operation() // 直接实现叶子节点的业务方法
        {
            Console.WriteLine("Leaf Operation...");
        }
    }

    // 非叶子节点
    class Composite : Component
    {
        private List<Component> list = new List<Component>(); // 体现组合模式的地方

        public override void Add(Component c)
        {
            list.Add(c);
        }

        public override void Remove(Component c)
        {
            list.Remove(c);
        }

        public override Component GetChild(int i)
        {
            return (Component)list[i];
        }

        public override void Operation()
        {
            foreach (Object obj in list) // 体现组合模式的地方
            {
                ((Component)obj).Operation(); // 递归实现业务方法
            }
        }
    }
}

 

posted on 2014-09-25 17:58  逝者如斯(乎)  阅读(348)  评论(0编辑  收藏  举报