c#设计12星座速配软件_C#设计模式(12)——组合模式
閱讀目錄
1.組合模式
在軟件開發中我們經常會遇到處理部分與整體的情況,如我們經常見到的樹形菜單,一個菜單項的子節點可以指向具體的內容,也可以是子菜單。類似的情況還有文件夾,文件夾的下級可以是文件夾也可以是文件。舉一個例子:一個公司的組織架構是這樣的,首先是總公司,總公司下邊有直屬員工和各個部門,各個部門下邊有本部門的子部門和員工。我們去怎么去獲取這個公司的組織架構呢(就是有層次地遍歷出公司的部門名和員工名)?
組合模式可以很好地解決這類問題,組合模式通過讓樹形結構的葉子節點和樹枝節點使用同樣的接口,結合遞歸的思想來處理部分與整體關系,這種方式模糊了簡單對象(葉子)和對象組(樹枝)間的概念,讓我們可以像處理單個對象一樣去處理對象組。
樹葉和樹枝都要使用相同的接口,所以先創建一個抽象類,其內部定義了樹枝和樹葉的公共接口:
///
/// 抽象部件 定義了樹枝和樹葉的公共屬性和接口
///
public abstract class Component
{
public string name;
public Component(string name)
{
this.name = name;
}
//添加子節點
public abstract void Add(Component c);
//刪除子節點
public abstract void Remove(Component c);
//展示方法,dept為節點深度
public abstract void Display(int dept);
}
員工類,相當于樹葉,沒有下一級:
//具體員工,樹形結構的Leaf
public class Employee : Component
{
public Employee(string name):base(name)
{
this.name = name;
}
//Leaf不能添加/刪除子節點所以空實現
public override void Add(Component c)
{
}
public override void Remove(Component c)
{
}
public override void Display(int dept)
{
Console.WriteLine(new string('-', dept)+name);
}
}
部門類,相當于樹枝,下邊的節點可有有子部門,也可以有員工:
///
/// 部門類,相當于樹枝
///
public class Depart : Component
{
public Depart(string name) : base(name)
{
this.name = name;
}
//添加子節點
public List children=new List();
public override void Add(Component c)
{
children.Add(c);
}
//刪除子節點
public override void Remove(Component c)
{
children.Remove(c);
}
//展示自己和和內部的所有子節點,這里是組合模式的核心
public override void Display(int dept)
{
Console.WriteLine(new string('-',dept)+name);
foreach (var item in children)
{
//這里用到了遞歸的思想
item.Display(dept + 4);
}
}
}
客戶端調用:
class Program
{
static void Main(string[] args)
{
Component DepartA = new Depart("A總公司");
Component DepartAX = new Depart("AX部門");
Component DepartAY = new Depart("AY部門");
Component DepartAX1 = new Depart("AX1子部門");
Component DepartAX2 = new Depart("AX2子部門");
Component Ae1 = new Employee("公司直屬員工1");
Component AXe1= new Employee("AX部門員工1");
Component AX1e1= new Employee("AX1部門員工1");
Component AX1e2= new Employee("AX1部門員工2");
Component AYe1= new Employee("AY部門員工1");
Component AYe2= new Employee("AY部門員工2");
DepartA.Add(Ae1);
DepartA.Add(DepartAX);
DepartA.Add(DepartAY);
DepartAX.Add(AXe1);
DepartAX.Add(DepartAX1);
DepartAX.Add(DepartAX2);
DepartAX1.Add(AX1e1);
DepartAX1.Add(AX1e2);
DepartAY.Add(AYe1);
DepartAY.Add(AYe2);
//遍歷總公司
DepartA.Display(1);
Console.ReadKey();
}
}
運行結果如下:
上邊的例子中部門類中包含了一個List children,這個List內部裝的是該部門的子節點,這些子節點可以是子部門也可以是員工,在部門類的Display方法中通過foreach來遍歷每一個子節點,如果子節點是員工則直接調用員工類中的Display方法打印出名字;如果子節點是子部門,調用部門類的Display遍歷子部門的下級節點,直到下級節點只有員工或者沒有下級節點為止。這里用到了遞歸的思想。
2.小結
上邊例子的類圖
組合模式的使用場景:當我們處理部分-整體的層次結構時,希望使用統一的接口來處理部分和整體時使用。
組合模式的優點:在樹形結構的處理中模糊了對象和對象組的概念,使用對象和對象組采用了統一的接口,讓我們可以像處理簡單對象一樣處理對象組。
總結
以上是生活随笔為你收集整理的c#设计12星座速配软件_C#设计模式(12)——组合模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平安财富宝活期盈怎么没有了?
- 下一篇: python和c#哪个简单-最近学习 P