分析設計形式編程中C#關於組合形式的應用。本站提示廣大學習愛好者:(分析設計形式編程中C#關於組合形式的應用)文章只能為提供參考,不一定能成為您想要的結果。以下是分析設計形式編程中C#關於組合形式的應用正文
1、引言
在軟件開辟進程中,我們常常會碰到處置簡略對象和復合對象的情形,例如對操作體系中目次的處置就是如許的一個例子,由於目次可以包含零丁的文件,也能夠包含文件夾,文件夾又是由文件構成的,因為簡略對象和復合對象在功效上差別,招致在操作進程中必需辨別簡略對象和復合對象,如許就會招致客戶挪用帶來不用要的費事,但是作為客戶,它們願望可以或許一直分歧地看待簡略對象和復合對象。但是組合形式就是處理如許的成績。上面讓我們看看組合形式是如何處理這個成績的。
2、組合形式的具體引見
2.1 組合形式的界說
組合形式許可你將對象組分解樹形構造來表示”部門-全體“的條理構造,使得客戶以分歧的方法處置單個對象和對象的組合。上面我們用繪制的例子來具體引見組合形式,圖形可以由一些根本圖形元素構成(如直線,圓等),也能夠由一些龐雜圖形構成(由根本圖形元素組合而成),為了使客戶對根本圖形和龐雜圖形的挪用堅持分歧,我們應用組合形式來到達全部目標。
組合形式完成的最症結的處所是——簡略對象和復合對象必需完成雷同的接口。這就是組合形式可以或許將組合對象和簡略對象停止分歧處置的緣由。
2.2 組合形式的完成
舉例:
家族譜的編寫:
男性:可傳宗接代,也有權力把一些人剔除族譜。
女性:記載抵家譜中,但不克不及傳宗接代。
懂得:每個大家庭中,爸爸媽媽和我,都是爸爸做主,可踢出我跟媽媽中的任何一個,也可增長任何一個。組件形式中的組件可所以零丁一個對象構成,也能夠是多個組件構成(一個家庭,乃至一個家庭的多級延續);
類圖:

族員個性代碼:
//// <summary>
/// //族人 籠統出來的族人個性
/// </summary>
public abstract class Father
{
//族人的姓名
protected string name = string.Empty;
public string Name
{
get
{
return name;
}
}
//增長子女
public abstract void Add(Father boy);
//逐落發譜
public abstract void Remove(Father boy);
//界說一切族人,做個簡介
public abstract void Intro();
}家族成員代碼
//男性子女
public class Boy : Father
{
//結構函數
public Boy() { }
public Boy(string Name)
{
this.name = Name;
}
List<Father> myFamily = new List<Father>();
//自我簡介
public override void Intro()
{
Console.WriteLine("我是:{0};", Name);
foreach (Father f in myFamily)
{
f.Intro();
}
}
//增長子女
public override void Add(Father boy)
{
myFamily.Add(boy);
}
//逐落發譜
public override void Remove(Father boy)
{
myFamily.Remove(boy);
}
}
//女性子女
public class Gril : Father
{
//結構函數
public Gril() { }
public Gril(string Name)
{
this.name = Name;
}
//自我簡介
public override void Intro()
{
Console.WriteLine("我是:{0};", Name);
}
//不克不及添加
public override void Add(Father store)
{
throw new NotImplementedException();
}
//不克不及刪除
public override void Remove(Father store)
{
throw new NotImplementedException();
}
}客戶端代碼:
public static void Main()
{
//爺爺取妻子
Boy yeye = new Boy("爺爺");
Gril nainai = new Gril("奶奶");
yeye.Add(nainai);
//爺爺要孩子
Boy baba = new Boy("爸爸");
Gril gugu = new Gril("姑姑");
yeye.Add(gugu);
yeye.Add(baba);
//爸爸要我
Boy me = new Boy("me");
baba.Add(me);
//我要孩子
Boy son = new Boy("son");
me.Add(son);
//爺爺的年夜家庭,族譜做引見
yeye.Intro();
Console.Read();
}
2.3組合形式的類圖
看完了下面,讓我們詳細看看組合形式的類圖來理清晰組合形式中類之間的關系。
通明式的組合形式類圖:

平安式組合形式的類圖:

組合形式中觸及到三個腳色:
3、組合形式的優缺陷
長處:
組合形式使得客戶端代碼可以分歧地處置對象和對象容器,無需關系處置的單個對象,照樣組合的對象容器。
將”客戶代碼與龐雜的對象容器構造“解耦。
可以更輕易地往組合對象中參加新的構件。
缺陷:使得設計加倍龐雜。客戶端須要花更多時光理清類之間的條理關系。(這個是簡直一切設計形式所面對的成績)。
留意的成績:
有時刻體系須要遍歷一個樹枝構造的子構件許多次,這時候候可以斟酌把遍歷子構件的構造存儲在父構件外面作為緩存。
客戶端盡可能不要直接挪用樹葉類中的辦法(在我下面完成就是如許的,創立的是一個樹枝的詳細對象,應當應用GraphicscomplexGraphics = new ComplexGraphics("一個龐雜圖形和兩條線段構成的龐雜圖形");),而是借用其父類(Graphics)的多態性完成挪用,如許可以增長代碼的復用性。
4、組合形式的應用場景
在以下情形下應當斟酌應用組合形式:
5、組合形式在.NET中的運用
組合形式在.NET 中最典范的運用就是運用與WinForms和Web的開辟中,在.NET類庫中,都為這兩個平台供給了許多現有的控件,但是System.Windows.Forms.dll中System.Windows.Forms.Control類就運用了組合形式,由於控件包含Label、TextBox等如許的簡略控件,同時也包含GroupBox、DataGrid如許復合的控件,每一個控件都須要挪用OnPaint辦法來停止控件顯示,為了表現這類對象之間全體與部門的條理構造,微軟把Control類的完成運用了組合形式(確實地說運用了通明式的組合形式)。
6、總結
到這裡組合形式的引見就停止了,組合形式解耦了客戶法式與龐雜元素外部構造,從而使客戶法式可以向處置簡略元素一樣來處置龐雜元素。