1、为什么要用组合模式?
当我们面对一个树形结构对象或者说是具备整体——部分的结构的对象时,我们又不想对于整体和部分分开进行处理,而是想用一个方法对整体和部分进行统一处理,举个例子,一个公司有人事部、IT部、财务部,人事部有小A、小B、小C,IT部有小D、小E、小F,财务部有小G,小H,小I,我们想对这三个部门的人的工资进行调整,统一增加1000元,那么我们对于这个具有整体-部分的对象,没有必要对于部门和具体员工进行区别处理,也就是说没有必要对于部门所有员工加工资使用一个方法,对于具体员工加工资使用另一个方法,我们统一使用一个方法就可以解决问题,这就是组合模式的初衷,代码如下:
部门和具体员工公有的方法抽象出来的抽象类
abstract class Employee
{
public abstract void Add(Employee employee);
public abstract void Delete(Employee employee);
public abstract Employee Get(int i);
public abstract void AddSalary(double salary);
}
部门类
```csharp
class Department : Employee
{
public List<Employee> array = new List<Employee>();
public override void Add(Employee employee)
{
array.Add(employee);
}
public override void Delete(Employee employee)
{
array.Remove(employee);
}
public override Employee Get(int i)
{
return array[i];
}
public override void AddSalary(double salary)
{
foreach (object item in array )
{
((Employee)item).AddSalary(salary);
}
}
}
``
具体员工类
class ConcreteEmployee:Employee
{
public string Name { get; set; }
public string DepartmentName { get; set; }
public ConcreteEmployee(string name,string department)
{
this.Name = name;
this.DepartmentName = department;
}
public override void AddSalary(double salary)
{
Console.WriteLine("{0}{1}工资增加了{2}", this.DepartmentName, this.Name, salary);
}
public override void Add(Employee employee)
{
}
public override void Delete(Employee employee)
{
}
public override Employee Get(int i)
{
return null;
}
}
调用结果
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Employee employeeA = new ConcreteEmployee("小A","人事部");
Employee employeeB = new ConcreteEmployee("小B", "人事部");
Employee employeeC = new ConcreteEmployee("小C", "人事部");
Employee departmentHR = new Department ();
departmentHR.Add(employeeA);
departmentHR.Add(employeeB);
departmentHR.Add(employeeC);
Employee employeeD= new ConcreteEmployee("小D", "IT部");
Employee employeeE = new ConcreteEmployee("小E", "IT部");
Employee employeeF = new ConcreteEmployee("小F", "IT部");
Employee departmentIT = new Department();
departmentIT.Add(employeeD);
departmentIT.Add(employeeE);
departmentIT.Add(employeeF);
Employee employeeG = new ConcreteEmployee("小G", "财务部");
Employee employeeH = new ConcreteEmployee("小H", "财务部");
Employee employeeI = new ConcreteEmployee("小I", "财务部");
Employee departmentFinance = new Department();
departmentFinance.Add(employeeG);
departmentFinance.Add(employeeH);
departmentFinance.Add(employeeI);
Employee department= new Department();
department.Add(departmentHR);
department.Add(departmentIT);
department.Add(departmentFinance);
department.AddSalary(2000);
}
调用结果
人事部小A工资增加了2000
人事部小B工资增加了2000
人事部小C工资增加了2000
IT部小D工资增加了2000
IT部小E工资增加了2000
IT部小F工资增加了2000
财务部小G工资增加了2000
财务部小H工资增加了2000
财务部小I工资增加了2000
从调用的部门代码看,我们只是在最后调用了一次AddSalary方法,但是我们给三个部门的所有员工的工资都增加了2000。