c#设计模式—组合模式

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。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c#上位机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值