1. 程式人生 > >.net設計模式 (組合模式)學習筆記

.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<Domain> domainsList = new List<Domain>();
        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);
            }
        }
    }




     /// <summary>
     /// 安全模式的組合 模式  在沒有子節點的 節點上
     /// </summary>
    public class DomainLeaf : AbstractDomain
    {

        private List<Domain> domainsList = new List<Domain>();

        //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();

        }
    }