组合模式(composite)

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

 

使用组合模式的场景:当需求中体现部分和整体层次的结构时候,希望用户可以忽略组合对象和当对象的不同,统一的使用组合结构中的所有对象的时候,就应该考虑组合模式。

组合模式可以让用户无差别的时候组合结构和单个对象。

 图示:

 

查看更多精彩图片

 

/// <summary>
    /// component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为
    /// 声明一个接口用于访问和管理component的子部件
    /// </summary>
    public abstract  class Componet
    {
        protected string name;
        public Componet(string name)
        {
            this.name = name;
        }
        public abstract void Add(Componet com);
        public abstract void Remove(Componet com);
        public abstract void DIsplay(int depth);
    }

    /// <summary>
    /// Leaf在组合中表示叶节点对象,叶节点没有子节点
    /// </summary>
    public class Leaf : Componet
    {
        public Leaf(string name)
            : base(name)
        {
 
        }
        public override void Add(Componet com)
        {
            Console.WriteLine("Can not add to a leaf");
        }

        public override void Remove(Componet com)
        {
            Console.WriteLine("can not remove from a leaf");
        }

        public override void DIsplay(int depth)
        {
            Console.WriteLine(new String('-',depth) + name);
        }
    }
   
    /// <summary>
    /// composite定义枝节点行为,
    /// </summary>
    public class Composite : Componet
    {
        /// <summary>
        /// 一个子对象集合用来存储其下属的枝节点和叶子节点
        /// </summary>
        private List<Componet> list = new List<Componet>();

        public Composite(string name) : base(name) { }

        public override void Add(Componet com)
        {
            list.Add(com);
        }

        public override void Remove(Componet com)
        {
            list.Remove(com);
        }

        /// <summary>
        /// 显示节点名称,并对下级遍历
        /// </summary>
        /// <param name="depth"></param>
        public override void DIsplay(int depth)
        {
            Console.WriteLine(new String('-',depth)+name);

            foreach (Componet com in list)
            {
                com.DIsplay(depth + 2);
            }
        }
    }

 

/// <summary>
        /// 客户端调用
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Composite root = new Composite("root");
            root.Add(new Leaf("Leaf A"));
            root.Add(new Leaf("Leaf B"));

            Composite comp = new Composite("composite X");
            comp.Add(new Leaf("Leaf XA"));
            comp.Add(new Leaf("Leaf XB"));

            root.Add(comp);

            root.DIsplay(1);

            Console.Read();
        }

 

 

 其中的叶子简单完全没必要实现add和remove方法,因为叶子简单不能有子集,但是必须继承component类,实现其中的抽象方法,这样做完全是为了保证枝节点和叶子简单具有完全一样的结构,使外界不用区分它们

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

posted @ 2010-07-12 01:21  音乐啤酒  阅读(194)  评论(0编辑  收藏  举报