第9章 組合模式(Composite Pattern)


原文 第9章 組合模式(Composite Pattern)

概述:

   組合模式有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解耦。

   將對象組合成樹形結構以表示“部分-整體”的層次結構。Composite模式使得用戶對單個對象和組合對象的使用具有一致性。[GOF 《設計模式》]

 

結構圖:

 

舉例:

   假設我們公司有做個打卡的程序,能滿足各種打卡的需要,比如整個公司能打卡,個人也能打卡(外包人員一個人支起一片天)。我們看看用組合模式是怎么實現的,這里不就講怎么演化的了!演化的過程比較容易誤導。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  public  abstract  class  Company
     {
         protected  string  companyName;
         public  string  CompanyName
         {
             get
             {
                 return  companyName;
             }
             set  {
                 companyName = value;
             }
         }
         //添加公司
         public  abstract  void  Add(Company name);
         //移除公司
         public  abstract  void  Remove(Company name);
         //打卡
         public  abstract  void  Register();
     }
 
     //個人
     public  class  Personal : Company
     {
         private  string  _name;
         public  Personal( string  name)
         {
             _name = name;
         }
 
         public  override  void  Add(Company name)
         {
             //個人添加的能力,所以不實現
             throw  new  NotImplementedException();
         }
 
         public  override  void  Remove(Company name)
         {
             //沒有添加功能,所以不能刪除
             throw  new  NotImplementedException();
         }
         //打卡
         public  override  void  Register()
         {
             Console.WriteLine( "{0}打卡了" ,_name);
         }
     }
     //一個公司
     public  class  WholeCompany : Company
     {
         List<Company> myList =  new  List<Company>();
         public  override  void  Add(Company name)
         {
             myList.Add(name);
         }
 
         public  override  void  Remove(Company name)
         {
             myList.Remove(name);
         }
 
         public  override  void  Register()
         {
             Console.WriteLine( "{0}" , companyName);
             foreach  (var item  in  myList)
             {
                  item.Register();
             }
         }
     }

我們看看 客戶端怎么調用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     class  Program
     {
         static  void  Main( string [] args)
         {
 
             Company reg =  new  WholeCompany();
             reg.CompanyName =  "本日打卡開始" ;
             //個體用戶
             Personal p1 =  new  Personal( "小A" );
             Company p2 =  new  Personal( "小B" );
             reg.Add(p1);
             reg.Add(p2);
             
             //公司用戶
             WholeCompany beijing =  new  WholeCompany();
             beijing.CompanyName =  "北京分公司" ;
             beijing.Add( new  Personal( "北京小王" ));
             beijing.Add( new  Personal( "北京小黑" ));
             reg.Add(beijing);
             
             reg.Register();
             Console.ReadLine();
 
         }
     }

執行結果:

寫到這里我們會發現,設計模式大多數都可以通用,同一種業務可以用很多種設計模式來做,但是只要我們弄清楚適用場景,就能選出一個更合適我們需求的設計模式。

適用性:

以下情況下適用Composite模式:
1.你想表示對象的部分-整體層次結構
2.你希望用戶忽略組合對象與單個對象的不同,用戶將統一地使用組合結構中的所有對象。

 

  

   設計模式系列文章入口http://www.diyibk.com/post/39.html


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: