說(shuo)說(shuo)設計模(mo)式~組合模(mo)式(Composite)
何時(shi)能(neng)用(yong)到(dao)它(ta)?
組(zu)合(he)模式又叫(jiao)部分-整體模式,在樹(shu)型結構中(zhong),模糊了(le)簡單(dan)(dan)元(yuan)(yuan)(yuan)素和復(fu)雜(za)元(yuan)(yuan)(yuan)素的概(gai)念(nian),客戶程(cheng)序(xu)可以向處理簡單(dan)(dan)元(yuan)(yuan)(yuan)素一(yi)(yi)樣來(lai)處理復(fu)雜(za)元(yuan)(yuan)(yuan)素,從(cong)而使得客戶程(cheng)序(xu)與復(fu)雜(za)元(yuan)(yuan)(yuan)素的內(nei)部結構解耦(ou)。對(dui)(dui)于今(jin)天這(zhe)(zhe)個例子來(lai)說,它(ta)(ta)(ta)可以很清楚的說明組(zu)合(he)模式的用意,首先(xian)是(shi)一(yi)(yi)個Graphics對(dui)(dui)象,它(ta)(ta)(ta)表示是(shi)一(yi)(yi)繪圖(tu)(tu)功能(樹(shu)根(gen)),而circle,line和rectangle分別是(shi)簡單(dan)(dan)的圖(tu)(tu)形(xing),它(ta)(ta)(ta)們內(nei)部不能再有其它(ta)(ta)(ta)圖(tu)(tu)形(xing)了(le)(相(xiang)當于樹(shu)葉),而picture是(shi)一(yi)(yi)個復(fu)雜(za)圖(tu)(tu)形(xing),它(ta)(ta)(ta)由circle,line和rectangle組(zu)成(相(xiang)當于樹(shu)枝(zhi)),而它(ta)(ta)(ta)對(dui)(dui)外(wai)將這(zhe)(zhe)些(xie)子對(dui)(dui)象隱藏了(le),只對(dui)(dui)外(wai)公開了(le)add和remove方法(fa),用來(lai)向picture內(nei)部添加簡單(dan)(dan)對(dui)(dui)象。
組合模式的結構圖
組合模式實現說明
Graphics:圖像基類,所以(yi)和(he)圖像有(you)關的(de)類都(dou)繼承(cheng)它
Picture:照片,它(ta)由一些(xie)簡單(dan)圖(tu)形組(zu)成
Circle:簡單圖(tu)形-圓
Line:簡(jian)單圖形-線
Rectangle:簡(jian)單(dan)圖形-矩(ju)形
組合模式的C#實現
#region 組合模式 /// <summary> /// 圖像基類,所以和圖像有關的類都繼(ji)承它(ta) /// </summary> public abstract class Graphics { protected string _name; public Graphics(string name) { this._name = name; } public abstract void Draw(); } /// <summary> /// 照片,它由一(yi)些(xie)簡單圖形組成 /// </summary> public class Picture : Graphics { protected ArrayList picList = new ArrayList(); public Picture(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a" + _name.ToString()); foreach (Graphics g in picList) { g.Draw(); } } public void Add(Graphics g) { picList.Add(g); } public void Remove(Graphics g) { picList.Remove(g); } } /// <summary> /// 簡單圖形-線 /// </summary> public class Line : Graphics { public Line(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a" + _name.ToString()); } } /// <summary> /// 簡(jian)單圖(tu)形(xing)-圓 /// </summary> public class Circle : Graphics { public Circle(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a" + _name.ToString()); } } /// <summary> /// 簡單(dan)圖形-矩形 /// </summary> public class Rectangle : Graphics { public Rectangle(string name) : base(name) { } public override void Draw() { Console.WriteLine("Draw a" + _name.ToString()); } } #endregion
調用代碼
#region 組合模式調用 Picture root = new Picture("Root"); root.Add(new Line("Line")); root.Add(new Circle("Circle")); Rectangle r = new Rectangle("Rectangle"); root.Add(r); root.Draw(); #endregion
屏幕截圖
通過上面的(de)圖我們可以發展,這個(ge)picture圖像,它由一條線,一個(ge)圓和一個(ge)矩形組成。