.net設計模式 (組合模式)學習筆記
阿新 • • 發佈:2018-12-20
運用設計模式只是為了解決一類問題的,當解決掉當前一類問題,通常會在解決這個問題時候 帶來其他問題 合理應用揚長避短
結構性設計模式:
.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(); } }