一. 组合模式
1. 背景
在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。
2. 定义和特点
(1). 定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
(2). 优点:
A. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
B. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
(3). 缺点
A. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
B. 不容易限制容器中的构件;
C. 不容易用继承的方法来增加构件的新功能;
3. 具体实现
(1). 模式结构
可以自身嵌套结构。
(2). 使用场景
存储上下级关系,CEO→技术主管→员工;CEO→销售主管→员工。
(3). 代码实操
上下级自身嵌套代码:
/// <summary>
/// 员工类
/// </summary>
public class Employee
{
private string name;
private string dept;
private int salary;
//代表下级子类
private List<Employee> subordinates;
//构造函数
public Employee(string name, string dept, int sal)
{
this.name = name;
this.dept = dept;
this.salary = sal;
subordinates = new List<Employee>();
}
public void add(Employee e)
{
subordinates.Add(e);
}
public void remove(Employee e)
{
subordinates.Remove(e);
}
public List<Employee> getSubordinates()
{
return subordinates;
}
public string toString()
{
return ("Employee :[ Name : " + name
+ ", dept : " + dept + ", salary :"
+ salary + " ]");
}
}
测试代码:
{
// 1、树形机构的场景,使用组合模式
Employee CEO = new Employee("张三", "CEO", 30000);
Employee headMarketing = new Employee("李四", "技术经理", 20000);
Employee headSales = new Employee("王五", "销售经理", 20000);
Employee clerk1 = new Employee("赵六", "销售", 10000);
Employee clerk2 = new Employee("钱七", "销售", 10000);
Employee salesExecutive1 = new Employee("Tony", "技术", 10000);
Employee salesExecutive2 = new Employee("Mark", "技术", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(clerk1);
headSales.add(clerk2);
headMarketing.add(salesExecutive1);
headMarketing.add(salesExecutive2);
//打印该组织的所有员工
Console.WriteLine(CEO.toString());
foreach (Employee headEmployee in CEO.getSubordinates())
{
Console.WriteLine(headEmployee.toString());
foreach (Employee employee in headEmpl