結構圖
公司(抽象類)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系統__組合模式
{
abstract class Company
{
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 ( ) ;
}
}
具體公司類 實現Company接口 樹枝節點
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系統__組合模式
{
class ConcreteCompany : Company
{
public ConcreteCompany ( string name) : base ( name)
{
}
private IList< Company> children = new List < Company > ( ) ;
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 c in children)
{
c. DisPlay ( depth + 2 ) ;
}
}
public override void LineOfDuty ( )
{
foreach ( Company company in children)
{
company. LineOfDuty ( ) ;
}
}
}
}
人力資源部 樹葉節點(不能向下產生分支)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系統__組合模式
{
class HRDPeartment : Company
{
public HRDPeartment ( string name) : base ( name)
{
}
public override void Add ( Company c)
{
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
}
public override void LineOfDuty ( )
{
Console. WriteLine ( "{0} 員工招聘培訓管理" , name) ;
}
public override void Remove ( Company c)
{
}
}
}
財務部類 樹葉節點(不能向下產生分支)
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系統__組合模式
{
class FinanceDepartment : Company
{
public FinanceDepartment ( string name) : base ( name)
{
}
public override void Add ( Company c)
{
}
public override void DisPlay ( int depth)
{
Console. WriteLine ( new String ( '-' , depth) + name) ;
}
public override void LineOfDuty ( )
{
Console. WriteLine ( "{0} 公司財務收支管理" , name) ;
}
public override void Remove ( Company c)
{
}
}
}
客戶端調用
using System;
using System. Collections. Generic;
using System. Linq;
using System. Text;
using System. Threading. Tasks;
namespace 公司管理系統__組合模式
{
class Program
{
static void Main ( string [ ] args)
{
ConcreteCompany root = new ConcreteCompany ( "北京責任有限公司" ) ;
root. Add ( new HRDPeartment ( "總公司人力資源部" ) ) ;
root. Add ( new FinanceDepartment ( "總公司財務部" ) ) ;
ConcreteCompany comp = new ConcreteCompany ( "上海華東分公司" ) ;
comp. Add ( new HRDPeartment ( "上海華東分公司資源部" ) ) ;
comp. Add ( new FinanceDepartment ( "上海華東分公司財務部" ) ) ;
root. Add ( comp) ;
ConcreteCompany comp1 = new ConcreteCompany ( "南京辦事處" ) ;
comp1. Add ( new HRDPeartment ( "南京辦事處人力資源部" ) ) ;
comp1. Add ( new FinanceDepartment ( "南京辦事處財務部" ) ) ;
comp. Add ( comp1) ;
ConcreteCompany comp2 = new ConcreteCompany ( "杭州辦事處" ) ;
comp2. Add ( new HRDPeartment ( "杭州辦事處人力資源部" ) ) ;
comp2. Add ( new FinanceDepartment ( "杭州辦事處財務部" ) ) ;
comp. Add ( comp2) ;
Console. WriteLine ( "\n 結構圖:" ) ;
root. DisPlay ( 1 ) ;
Console. WriteLine ( "\n 職責" ) ;
root. LineOfDuty ( ) ;
Console. Read ( ) ;
}
}
}
總結:組合模式定義了包含人力資源和財務部這些基本對象和分公司,辦事處等組合對象的類層次結構。基本對象可以被組合成更復雜的組合對象 而這個組合對象又可以被組合 這樣不斷的遞歸下去 客戶端代碼中 任何用到基本對象的地方都可以使用組合對象了。
用戶不用關心到底是處理一個葉節點還是處理一個組合組件 也就用不着爲定義組合而寫一些判斷語句了。