C#復(fù)合模式(Composite Pattern)實(shí)例教程
本文以一個(gè)簡(jiǎn)單實(shí)例的形式講述了C#復(fù)合模式。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:
一般在顯示樹(shù)形結(jié)構(gòu)時(shí),復(fù)合模式有很好的體現(xiàn)。本文實(shí)例顯示如下部門結(jié)構(gòu):

如上圖所示,有的節(jié)點(diǎn)包含子節(jié)點(diǎn),有的節(jié)點(diǎn)不包含子節(jié)點(diǎn)。不管是什么節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)就代表一個(gè)部門。
首先設(shè)計(jì)一個(gè)關(guān)于部門的抽象基類。
public abstract class DepartmentComponent
{
public string Name { private set; get; }
public DepartmentComponent(string name)
{
this.Name = name;
}
public virtual void PrintSupervisorOf(int spacing)
{
for (int counter = 0; counter < spacing; counter++)
{
Console.Write(" ");
}
Console.WriteLine(Name);
}
}
以上,通過(guò)構(gòu)造函數(shù)給屬性賦值,通過(guò)PrintSupervisorOf(int spacing)方法打印出節(jié)點(diǎn)的名稱。
接下來(lái)設(shè)計(jì)包含子節(jié)點(diǎn)的節(jié)點(diǎn)。該類維護(hù)著DepartmentComponent類型的集合,提供方法向這個(gè)集合中添加節(jié)點(diǎn)或從集合中刪除節(jié)點(diǎn)。
public class DepartmentComposite : DepartmentComponent
{
private IList<DepartmentComponent> employees;
public DepartmentComposite(string name) : base(name)
{
employees = new List<DepartmentComponent>();
}
public void AddDepartment(DepartmentComponent e)
{
employees.Add(e);
}
public void RemoveDepartment(DepartmentComponent e)
{
employees.Remove(e);
}
public override void PrintSupervisorOf(int spacing)
{
base.PrintSupervisorOf(spacing);
foreach (DepartmentComponent e in employees)
{
e.PrintSupervisorOf(spacing + 1);
}
}
}
以上 PrintSupervisorOf(int spacing)方法重寫(xiě)了抽象基類的方法,不僅把本節(jié)點(diǎn)的名稱打印出來(lái),還使用遞歸把所有子節(jié)點(diǎn)的名稱顯示出來(lái)。
最后設(shè)計(jì)部包含子節(jié)點(diǎn)的節(jié)點(diǎn)。
public class Department : DepartmentComponent
{
public Department(string name) : base(name)
{
}
public override void PrintSupervisorOf(int spacing)
{
base.PrintSupervisorOf(spacing);
}
}
客戶端部分。
class Program
{
static void Main(string[] args)
{
DepartmentComposite salesDepartment1 = new DepartmentComposite("銷售部1");
Department zhangsan = new Department("張三");
Department lisi = new Department("李四");
DepartmentComposite salesDepartment2 = new DepartmentComposite("銷售部2");
DepartmentComposite specialDepartment = new DepartmentComposite("銷售部2特別行動(dòng)組");
Department wangwu = new Department("王五");
Department zhaoliu = new Department("趙六");
DepartmentComposite salesDepartment = new DepartmentComposite("銷售部");
salesDepartment.AddDepartment(salesDepartment1);
salesDepartment.AddDepartment(salesDepartment2);
salesDepartment1.AddDepartment(zhangsan);
salesDepartment1.AddDepartment(lisi);
salesDepartment2.AddDepartment(specialDepartment);
specialDepartment.AddDepartment(wangwu);
specialDepartment.AddDepartment(zhaoliu);
salesDepartment.PrintSupervisorOf(0);
Console.ReadKey();
}
}
程序運(yùn)行結(jié)果如下圖所示:

希望本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有所幫助。
相關(guān)文章
解析StreamReader與文件亂碼問(wèn)題的解決方法
本篇文章是對(duì)StreamReader與文件亂碼問(wèn)題的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C#實(shí)現(xiàn)12306自動(dòng)登錄的方法
本文介紹了C#實(shí)現(xiàn)12306自動(dòng)登錄的方法,主要方法是捕獲參數(shù)和url并補(bǔ)充參數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-07-07
C#使用Consul集群進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn)
這篇文章主要介紹了C#使用Consul集群進(jìn)行服務(wù)注冊(cè)與發(fā)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽實(shí)例
這篇文章主要介紹了基于WebClient實(shí)現(xiàn)Http協(xié)議的Post與Get對(duì)網(wǎng)站進(jìn)行模擬登陸和瀏覽的方法,以實(shí)例形式詳細(xì)分析了WebClient模擬POST與GET登陸與瀏覽的過(guò)程,對(duì)于C#項(xiàng)目開(kāi)發(fā)來(lái)說(shuō)具有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2014-11-11

