关键词:树
将对象组织成树形结构
意图:
将对象组合成树形结构以表示“部分 -整体”的层次结构。 C o m p o s i t e使得用户对单个对象和组合对象的使用具有一致性。
适用性:
• 你想表示对象的部分 -整体层次结构。
• 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
案例:(公司结构 部门-员工 整合获取某一部分员工信息)
namespace FactoryMethod_DesignPattern2
{
using System;
using System.Collections;
public abstract class EmployeeBase//公司
{
protected string strName;
public int salary;//!!
public EmployeeBase(string name, int salary)
{
strName = name;
this.salary = salary;
}
abstract public void Add(EmployeeBase c);
//abstract public void Add(EmployeeBase[] cs);
public abstract void DumpContents();
virtual public int GetSalary()
{
return salary;
}
// other operations for delete, get, etc.
}
public class Manager : EmployeeBase//CEO 部门经理
{
private ArrayList employees = new ArrayList();
public Manager(string s, int salary) : base(s, salary) { }
override public void Add(EmployeeBase c)
{
employees.Add(c);
}
public int Count
{
get { return employees.Count; }
}
public override void DumpContents()
{
// First dump the name of this composite node
Console.WriteLine("Node: {0}", strName);
// Then loop through children, and get then to dump their contents
foreach (EmployeeBase c in employees)
{
c.DumpContents();
}
}
public EmployeeBase GetChild(int i)
{
return (EmployeeBase)employees[i];
}
}
public class Employee : EmployeeBase
{
public Employee(string s, int salary) : base(s, salary) { }
override public void Add(EmployeeBase c)
{
Console.WriteLine("Cannot add to a leaf");
}
public override void DumpContents()
{
Console.WriteLine("Node: {0}", strName);
}
}
/// <summary>
/// Summary description for Client.
/// </summary>
public class Client
{
public static void Main(string[] args)
{
//EmployeeBase component;
//Client c = new Client();
//component = c.SetupTree();
Employee e1 = new Employee("z1", 10000);
Employee e2 = new Employee("z2", 10000);
Employee e3 = new Employee("z3", 10000);
Employee e4 = new Employee("z4", 10000);
Employee e5 = new Employee("z5", 10000);
Employee e6 = new Employee("z6", 10000);
Employee e7 = new Employee("z7", 10000);
Employee e8 = new Employee("z8", 10000);
Employee e9 = new Employee("z9", 10000);
Manager m1 = new Manager("l1ceo", 50000);
Manager m2 = new Manager("l市场", 30000);
Manager m3 = new Manager("l客服", 30000);
Manager m4 = new Manager("l研发", 30000);
Manager m5 = new Manager("l研发服务端", 30000);
Manager m6 = new Manager("l研发客户端", 30000);
//建立层次关系
m1.Add(m2);
m1.Add(m3);
m1.Add(m4);
m2.Add(e1);
m2.Add(e2);
m3.Add(e3);
m3.Add(e4);
m4.Add(m5);
m4.Add(m6);
m5.Add(e5);
m5.Add(e6);
m6.Add(e7);
m6.Add(e8);
m6.Add(e9);
//计算所有人员的薪水
var totalSalary = GetAllSalary(m6);
Console.WriteLine(totalSalary);
Console.ReadLine();
}
public static int GetAllSalary(EmployeeBase emp)
{
var salary = emp.GetSalary();
if (emp is Manager)
{
var mgr = emp as Manager;
for (int i = 0; i < mgr.Count;i++ )
{
salary = salary + GetAllSalary(mgr.GetChild(i));
}
}
return salary;
}
}
}