锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
緇勫悎妯″紡鏈夋椂鍊欏張鍙仛閮ㄥ垎-鏁翠綋妯″紡錛屽畠浣挎垜浠爲鍨嬬粨鏋勭殑闂涓紝妯$硦浜嗙畝鍗曞厓绱犲拰澶嶆潅鍏冪礌鐨勬蹇碉紝瀹㈡埛紼嬪簭鍙互鍚戝鐞嗙畝鍗曞厓绱犱竴鏍鋒潵澶勭悊澶嶆潅鍏冪礌,浠庤屼嬌寰楀鎴風▼搴忎笌澶嶆潅鍏冪礌鐨勫唴閮ㄧ粨鏋勮В鑰︺?/span>
緇勫悎妯″紡錛圕omposite Pattern錛夛細灝嗗璞$粍鍚堟垚鏍戝艦緇撴瀯浠ヨ〃紺?#8216;閮ㄥ垎-鏁翠綋’鐨勫眰嬈$粨鏋勶紝緇勫悎妯″紡浣垮緱鐢ㄦ埛瀵瑰崟涓璞″拰緇勫悎瀵硅薄鐨勪嬌鐢ㄥ叿鏈変竴鑷存с?/strong>
緇勫悎妯″紡緇撴瀯鍥懼涓嬶細
緇撴瀯鍥捐鏄庯細
錛?錛塁omponent錛氱粍鍚堜腑鐨勫璞″0鏄庢帴鍙o紝鍦ㄩ傚綋鎯呭喌涓嬪疄鐜版墍鏈夌被鍏辨湁鐨勯粯璁よ涓猴紝澹版槑涓涓帴鍙g敤浜庤闂拰綆$悊Component鐨勫瓙緇勪歡銆傚湪閫掑綊緇撴瀯涓畾涔変竴涓帴鍙o紝鐢ㄤ簬璁塊棶涓涓埗閮ㄤ歡錛屽茍鍦ㄥ悎閫傜殑鎯呭喌涓嬪疄鐜板畠銆傦紙鍙夛級
錛?錛塋eaf:鍦ㄧ粍鍚堜腑琛ㄧず鍙惰妭鐐癸紝鍙惰妭鐐規(guī)病鏈夊瓙鑺傜偣錛屽畾涔夊璞$殑鍩烘湰琛屼負銆?/p>
錛?錛塁omposite錛氬畾涔夋湁瀛愰儴浠剁殑閭d簺閮ㄤ歡鐨勮涓猴紝瀛樺偍瀛愰儴浠跺茍鍦–omponent鎺ュ彛瀹炵幇涓庡瓙閮ㄤ歡鏈夊叧鐨勬搷浣溿?/p>
錛?錛塁lient:閫氳繃Component鎺ュ彛鎿嶄綔緇勫悎閮ㄤ歡鐨勫璞°?/p>
緇勫悎妯″紡鍩烘湰浠g爜錛?/p>
Composite:
Leaf:
鍙互鐪嬪嚭錛孋omposite綾誨瀷鐨勫璞″彲浠ュ寘鍚叾瀹僀omponent綾誨瀷鐨勫璞°傛崲鑰岃█涔嬶紝Composite綾誨瀷瀵硅薄鍙互鍚湁鍏跺畠鐨勬爲鏋濓紙Composite錛夌被鍨嬫垨鏍戝彾錛圠eaf錛夌被鍨嬬殑瀵硅薄銆?/p>
緇勫悎妯″紡鐨勫疄鐜版牴鎹墍瀹炵幇鎺ュ彛鐨勫尯鍒垎涓轟袱縐嶅艦寮忥紝鍒嗗埆縐頒負瀹夊叏妯″紡鍜岄忔槑妯″紡銆傜粍鍚堟ā寮忓彲浠ヤ笉鎻愪緵鐖跺璞$殑綆$悊鏂規(guī)硶錛屼絾緇勫悎妯″紡蹇呴』鍦ㄥ悎閫傜殑鍦版柟鎻愪緵瀛愬璞$殑綆$悊鏂規(guī)硶錛堣濡傦細add銆乺emove絳夛級銆傚畨鍏ㄥ紡鐨勭粍鍚堟ā寮忚姹傜鐞嗚仛闆嗙殑鏂規(guī)硶鍙嚭鐜板湪鏍戞灊鏋勪歡綾諱腑錛岃屼笉鍑虹幇鍦ㄦ爲鍙舵瀯浠朵腑銆備笌瀹夊叏寮忕殑緇勫悎妯″紡涓嶅悓鐨勬槸錛岄忔槑寮忕殑緇勫悎妯″紡瑕佹眰鎵鏈夌殑鍏蜂綋鏋勪歡綾伙紝涓嶈鏍戞灊鏋勪歡榪樻槸鏍戝彾鏋勪歡錛屽潎絎﹀悎涓涓浐瀹氱殑鎺ュ彛銆?/p>
閫忔槑妯″紡錛?/strong>涔熷氨鏄鍦–omponent涓0鏄庢墍鏈夌敤鏉ョ鐞嗗瓙瀵硅薄鐨勬柟娉曪紝鍏朵腑鍖呮嫭Add銆丷emove絳夈傝繖鏍峰疄鐜癈omponent鎺ュ彛鐨勬墍鏈夊瓙綾婚兘鍏峰浜咥dd鍜孯emove銆傝繖鏍峰仛鐨勫ソ澶勫氨鏄彾鑺傜偣鍜屾灊鑺傜偣瀵逛簬澶栫晫娌℃湁鍖哄埆錛屽畠浠叿鏈夊畬鍏ㄤ竴鑷寸殑琛屼負鎺ュ彛錛屼絾闂涔熷緢鏄庢樉錛屽洜涓篖eaf綾繪湰韜笉鍏峰Add(),Remove()鏂規(guī)硶鐨勫姛鑳斤紝鎵浠ュ疄鐜頒粬鏄病鏈夋剰涔夌殑銆?/p>
瀹夊叏妯″紡錛?/strong>灝辨槸鍦–omponent鎺ュ彛涓笉鍘誨0鏄嶢dd鍜孯emove鏂規(guī)硶錛岄偅涔堝瓙綾葷殑Leaf涔熷氨涓嶉渶瑕佸幓瀹炵幇瀹冿紝鑰屾槸鍦–omposite澹版槑鎵鏈夌敤鏉ョ鐞嗗瓙綾誨璞$殑鏂規(guī)硶錛岃繖鏍峰氨涓嶄細鍑虹幇閫忔槑妯″紡鍑虹幇鐨勯棶棰橈紝涓嶈繃鐢變簬涓嶅閫忔槑錛屾墍浠ュ彾鑺傜偣鍜屾灊鑺傜偣灝嗕笉鍏鋒湁鐩稿悓鐨勬帴鍙o紝瀹㈡埛绔皟鐢ㄩ渶瑕佸仛鐩稿簲鐨勫垽鏂紝甯︽潵浜嗕笉渚褲?/p>
2.瀹炰緥錛堝ぇ璇濊璁℃ā寮忥級 澶ц瘽璁捐妯″紡涓殑鍏徃綆$悊緋葷粺鐨勭粨鏋勫浘濡備笅錛?/p>
鍏蜂綋瀹炵幇浠g爜濡備笅錛?/p>
瀹㈡埛绔唬鐮侊細 鍦?NET涓紝涓涓吀鍨嬬殑緇勫悎妯″紡瀹炰緥灝辨槸.NET鐨勬帶浠訛紝濡侭utton錛孴extBox鍜孡abel絳夛紝榪欎簺鎺т歡閮芥槸緇ф壙鑷狢ontrol綾伙紝璇ョ被鑷韓鍖呭惈ControlCollection鐨勯泦鍚圕ontrols錛屾帶浠跺拰瀛愭帶浠剁殑閫昏緫鍏崇郴濡備笅鍥撅細 浣曟椂閲囩敤緇勫悎妯″紡錛?/strong> 1.闇姹傞噸瑕佷綋鐜伴儴鍒嗕笌鏁翠綋鐨勫眰嬈$粨鏋勬椂 2.浣犲笇鏈涚敤鎴峰拷鐣ョ粍鍚堝璞′笌鍗曚釜瀵硅薄鐨勪笉鍚岋紝鐢ㄦ埛灝嗙粺涓鍦頒嬌鐢ㄧ粍鍚堢粨鏋勪腑鐨勬墍鏈夊璞°?/p>
浣跨敤鏁堟灉錛?/strong> 1錛嶤omposite妯″紡閲囩敤鏍戝艦緇撴瀯鏉ュ疄鐜版櫘閬嶅瓨鍦ㄧ殑瀵硅薄瀹瑰櫒錛屼粠鑰屽皢“涓瀵瑰”鐨勫叧緋昏漿鍖?#8220;涓瀵逛竴”鐨勫叧緋伙紝浣垮緱瀹㈡埛浠g爜鍙互涓鑷村湴澶勭悊瀵硅薄鍜屽璞″鍣紝鏃犻渶鍏沖績澶勭悊鐨勬槸鍗曚釜鐨勫璞★紝榪樻槸緇勫悎鐨勫璞″鍣ㄣ?br style="margin: 0px; padding: 0px;" />
2錛庡皢“瀹㈡埛浠g爜涓庡鏉傜殑瀵硅薄瀹瑰櫒緇撴瀯”瑙h︽槸Composite妯″紡鐨勬牳蹇冩濇兂錛岃В鑰︿箣鍚庯紝瀹㈡埛浠g爜灝嗕笌綰補鐨勬娊璞℃帴鍙?#8212;—鑰岄潪瀵硅薄瀹瑰櫒鐨勫鍐呴儴瀹炵幇緇撴瀯——鍙戠敓渚濊禆鍏崇郴錛屼粠鑰屾洿鑳?#8220;搴斿鍙樺寲”銆?br style="margin: 0px; padding: 0px;" />
3錛嶤omposite妯″紡涓紝鏄皢“Add鍜孯emove絳夊拰瀵硅薄瀹瑰櫒鐩稿叧鐨勬柟娉?#8221;瀹氫箟鍦?#8220;琛ㄧず鎶借薄瀵硅薄鐨凜omponent綾?#8221;涓紝榪樻槸灝嗗叾瀹氫箟鍦?#8220;琛ㄧず瀵硅薄瀹瑰櫒鐨凜omposite綾?#8221;涓紝鏄竴涓叧涔?#8220;閫忔槑鎬?#8221;鍜?#8220;瀹夊叏鎬?#8221;鐨勪袱闅鵑棶棰橈紝闇瑕佷粩緇嗘潈琛°傝繖閲屾湁鍙兘榪濊儗闈㈠悜瀵硅薄鐨?#8220;鍗曚竴鑱岃矗鍘熷垯”錛屼絾鏄浜庤繖縐嶇壒孌婄粨鏋勶紝榪欏張鏄繀欏諱粯鍑虹殑浠d環(huán)銆侫SP.NET鎺т歡鐨勫疄鐜板湪榪欐柟闈負鎴戜滑鎻愪緵浜嗕竴涓緢濂界殑紺鴻寖銆?br style="margin: 0px; padding: 0px;" />
4錛嶤omposite妯″紡鍦ㄥ叿浣撳疄鐜頒腑錛屽彲浠ヨ鐖跺璞′腑鐨勫瓙瀵硅薄鍙嶅悜榪芥函錛涘鏋滅埗瀵硅薄鏈夐綣佺殑閬嶅巻闇姹傦紝鍙嬌鐢ㄧ紦瀛樻妧宸ф潵鏀瑰杽鏁堢巼銆?br style="margin: 0px; padding: 0px;" />
鍙傝冭祫鏂欙細 澶у寲璁捐妯″紡 http://terrylee.cnblogs.com/archive/2006/03/11/347919.htmlCompanyComposite
{
protected string name;
public Company(string name)
{
this.name = name;
}
public abstract void Add(Company c);//澧炲姞
public abstract void Remove(Company c);//縐婚櫎
public abstract void Display(int depth);//鏄劇ず
public abstract void LineOfDuty();//灞ヨ鑱岃矗
}
public class ConcreteCompany : Company
{
private List<Company> children = new List<Company>();
public ConcreteCompany(string name)
: base(name)
{ }
public override void Add(Company c)
{
children.Add(c);
}
public override void Remove(Company c)
{
children.Remove(c);
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
foreach (Company component in children)
{
component.Display(depth + 2);
}
}
//灞ヨ鑱岃矗
public override void LineOfDuty()
{
foreach (Company component in children)
{
component.LineOfDuty();
}
}
}
//浜哄姏璧勬簮閮?/span>
public class HRDepartment : Company
{
public HRDepartment(string name)
: base(name)
{ }
public override void Add(Company c)
{
}
public override void Remove(Company c)
{
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
public override void LineOfDuty()
{
Console.WriteLine("{0} 鍛樺伐鎷涜仒鍩硅綆$悊", name);
}
}
//璐㈠姟閮?/span>
public class FinanceDepartment : Company
{
public FinanceDepartment(string name)
: base(name)
{ }
public override void Add(Company c)
{
}
public override void Remove(Company c)
{
}
public override void Display(int depth)
{
Console.WriteLine(new String('-', depth) + name);
}
public override void LineOfDuty()
{
Console.WriteLine("{0} 鍏徃璐㈠姟鏀舵敮綆$悊", name);
}
}Code
{
static void Main(string[] args)
{
ConcreteCompany root = new ConcreteCompany("鍖椾含鎬誨叕鍙?);
root.Add(new HRDepartment("鎬誨叕鍙鎬漢鍔涜祫婧愰儴"));
root.Add(new FinanceDepartment("鎬誨叕鍙歌儲鍔¢儴"));
ConcreteCompany comp = new ConcreteCompany("涓婃搗鍗庝笢鍒嗗叕鍙?);
comp.Add(new HRDepartment("鍗庝笢鍒嗗叕鍙鎬漢鍔涜祫婧愰儴"));
comp.Add(new FinanceDepartment("鍗庝笢鍒嗗叕鍙歌儲鍔¢儴"));
root.Add(comp);
ConcreteCompany comp1 = new ConcreteCompany("鍗椾含鍔炰簨澶?);
comp1.Add(new HRDepartment("鍗椾含鍔炰簨澶勪漢鍔涜祫婧愰儴"));
comp1.Add(new FinanceDepartment("鍗椾含鍔炰簨澶勮儲鍔¢儴"));
comp.Add(comp1);
ConcreteCompany comp2 = new ConcreteCompany("鏉窞鍔炰簨澶?);
comp2.Add(new HRDepartment("鏉窞鍔炰簨澶勪漢鍔涜祫婧愰儴"));
comp2.Add(new FinanceDepartment("鏉窞鍔炰簨澶勮儲鍔¢儴"));
comp.Add(comp2);
Console.WriteLine("\n緇撴瀯鍥撅細");
root.Display(1);
Console.WriteLine("\n鑱岃矗錛?);
root.LineOfDuty();
Console.Read();
}
}
鍘熷笘鍦板潃錛?br />
]]>
1.鍚庣紑涓?c鐨勶紝gcc鎶婂畠褰撲綔鏄疌紼嬪簭錛岃実++褰撲綔鏄痗++紼嬪簭錛涘悗緙涓?cpp鐨勶紝涓よ呴兘浼氳涓烘槸c++紼嬪簭錛屾敞鎰忥紝铏界劧c++鏄痗鐨勮秴闆嗭紝浣嗘槸涓よ呭璇硶鐨勮姹傛槸鏈夊尯鍒殑銆侰++鐨勮娉曡鍒欐洿鍔犱弗璋ㄤ竴浜涖?nbsp; 闃呰鍏ㄦ枃
]]>
]]>
]]>
鍚楋紵鍦ㄥ皢鍚勭綾誨瀷鐨勬暟鎹瀯閫犳垚瀛楃涓叉椂錛宻printf 鐨勫己澶у姛鑳藉緢灝戜細璁╀綘澶辨湜銆?nbsp; 闃呰鍏ㄦ枃
]]>
]]>
]]>
]]>
]]>
闃呰鍏ㄦ枃
]]>