zoukankan      html  css  js  c++  java
  • 组合模式(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注册。

  • 相关阅读:
    JSON Web Token 使用详解
    Linux文件同步工具之rsync
    Centos7升级Git版本
    JSON Web Token 使用详解
    解决List遍历删除元素提示ConcurrentModificationException
    Spring Boot入门篇之配置Filter
    通过PLSQL Developer创建Database link,DBMS_Job,Procedure,实现Oracle跨库传输数据
    微信运动数据抓取(PHP)
    使用Redis Data Reveal(rdr)查看Redis中key占用内存空间
    Redis5.0-弃用方法名和替代方法名(php-redis 5以后废弃了一些方法名)
  • 原文地址:https://www.cnblogs.com/zjypp/p/2319291.html
Copyright © 2011-2022 走看看