.net设计模式 (组合模式)学习笔记

运用设计模式只是为了解决一类问题的,当解决掉当前一类问题,通常会在解决这个问题时候 带来其他问题  合理应用扬长避短


结构性设计模式:

                          .net设计模式 (组合模式)学习笔记  

概要:一般用于复合对象, 即它们在充当对象的同时,又可以作为容器包含其他多个对象。

具体实现 有点类似 递归调用。区别在于递归是自己调用自己,而组合模式是 根节点 调用子节点,子节点作物父节点又调用自己的子节点 进行遍历 

组合模式 主要有两大类, 1透明模式 ,  2 安全模式: 在标准写法中,

  • 安全模式: 会多一个 叶节点(也就是到头了  不在包含子节点)这样做的好处在于  在叶节点不会再往下执行。

  • 透明模式:在透明模式中 上下保持一致。但是有可能不安全,应为在 继承 抽象的时候 在叶节点 无法继续添加节点  处理不当会造成潜在危害

优点:对于复杂 树型 结构的数据 不用关心 子节点的具体实现,只对树的根 节点进行操作。

 

现在我们一个 需求,项目组分红的需求, 思路是这样的,项目方直接把钱给公司, 10亿的分红 直接从上到下  给各部门领导, 领导又分给自己部门的主管,主管在细分给自己下属领导。 作为公司不用关心钱怎么细分下去。 这个是有各部门领导去细化的。 作为公司领导不是不方便很多。

    //组合模式的基类
    public abstract class AbstractDomain
    {
        public string Name{ get; set;}
        public double Percent { get; set; }
        //经典的地方
        public abstract void Commission(double totle);
    }


    ///子类
    public class Domain : AbstractDomain
    {
        private List domainsList = new List();
        public void AddChild(Domain domain)
        {
            this.domainsList.Add(domain);
        }

        //遍历
        public override void Commission(double totle)
        {
            double resoult = totle * this.Percent / 100;
            Console.WriteLine("This: {0} 提成 {1}",this.Name,resoult);

            foreach (var domainchild in domainsList)
            {
                domainchild.Commission(resoult);
            }
        }
    }




     /// 
     /// 安全模式的组合 模式  在没有子节点的 节点上
     /// 
    public class DomainLeaf : AbstractDomain
    {

        private List domainsList = new List();

        //public void AddChild(Domain domain)
        //{
        //    this.domainsList.Add(domain);
        //}


        遍历
        public override void Commission(double totle)
        {
            double resoult = totle * this.Percent / 100;
            Console.WriteLine("This: {0} 提成 {1}",this.Name,resoult);

            foreach (var domainchild in domainsList)
            {
                domainchild.Commission(resoult);
            }
        }
    }





     ///开始使用
    class Program
    {
        static void Main(string[] args)
        {

            ///构造一个树型结构 数据

            double total = 100000000;//人民币

            Domain domain = new Domain()   { Name = "总的数目", Percent = 10 };
            Domain domain1 = new Domain()  { Name = "CEO", Percent = 30 };
            Domain domain2 = new Domain()  { Name = "各部门共有", Percent = 70 };
            Domain domain21 = new Domain() { Name = "实施", Percent = 20 };
            Domain domain22 = new Domain() { Name = "测试", Percent = 10 };
            Domain domain23 = new Domain() { Name = "销售", Percent = 30 };
            Domain domain24 = new Domain() { Name = "开发", Percent = 40 };

            Domain domain241 = new Domain() { Name = "经理", Percent = 20 };
            Domain domain242 = new Domain() { Name = "主管", Percent = 15 };
            Domain domain243 = new Domain() { Name = "开发人员", Percent = 65 };

            Domain domain2431 = new Domain() { Name = "开发团队1", Percent = 50 };
            Domain domain2432 = new Domain() { Name = "开发团队2", Percent = 50 };


            Domain domain24321 = new Domain() { Name = "项目经理", Percent = 20 };
            Domain domain24322 = new Domain() { Name = "开发人员", Percent = 80 };

            Domain domain243221 = new Domain() { Name = "高级开发员", Percent = 40 };
            Domain domain243222 = new Domain() { Name = "开发人员", Percent = 30 };
            Domain domain243223 = new Domain() { Name = "开发人员", Percent = 20 };
            Domain domain243224 = new Domain() { Name = "实习生", Percent = 10 };

            Domain domain2432241 = new Domain() { Name = "实习生1", Percent = 25 };
            Domain domain2432242 = new Domain() { Name = "实习生2", Percent = 25 };
            Domain domain2432243 = new Domain() { Name = "实习生3", Percent = 25 };
            Domain domain2432244 = new Domain() { Name = "实习生4", Percent = 25 };

            domain243224.AddChild(domain2432241);
            domain243224.AddChild(domain2432242);
            domain243224.AddChild(domain2432243);
            domain243224.AddChild(domain2432244);

            domain24322.AddChild(domain243221);
            domain24322.AddChild(domain243222);
            domain24322.AddChild(domain243223);
            domain24322.AddChild(domain243224);


            domain2432.AddChild(domain24321);
            domain2432.AddChild(domain24322);


            domain243.AddChild(domain2431);
            domain243.AddChild(domain2432);

            domain24.AddChild(domain241);
            domain24.AddChild(domain242);
            domain24.AddChild(domain243);

            domain2.AddChild(domain21);
            domain2.AddChild(domain22);
            domain2.AddChild(domain23);
            domain2.AddChild(domain24);


            domain.AddChild(domain1);
            domain.AddChild(domain2);

            domain.Commission(total); ///从这个展开
            Console.ReadKey();

        }
    }

 

你可能感兴趣的:(设计模式)