组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。
实例演示了一个组织中员工的层次结构:
namespace 组合模式
{
internal class Program
{
static void Main(string[] args)
{
CorporateStructure CEO = new CorporateStructure("张三", "CEO", 50000);
CorporateStructure manager = new CorporateStructure("李四", "manager", 20000);
CorporateStructure staff1 = new CorporateStructure("王五", "staff", 9000);
CorporateStructure staff2 = new CorporateStructure("赵六", "staff", 8000);
CorporateStructure staff3 = new CorporateStructure("田七", "staff", 10000);
CEO.Add(manager);
manager.Add(staff1);
manager.Add(staff2);
manager.Add(staff3);
//遍历 公司所有部门 中的人员
Console.WriteLine(CEO.ToString());
foreach (CorporateStructure PrintCEO in CEO.GetSubordinates())
{
Console.WriteLine(PrintCEO.ToString());
foreach (CorporateStructure PrintManager in PrintCEO.GetSubordinates())
{
Console.WriteLine(PrintManager.ToString());
}
}
}
}
//组合模型类
public class CorporateStructure
{
private string name;
private string position;
private int salary;
private List<CorporateStructure> subordinates;
public CorporateStructure(string name, string position, int salary)
{
this.name = name;
this.position=position;
this.salary=salary;
subordinates = new List<CorporateStructure>();
}
public void Add(CorporateStructure corporateStructure)
{
subordinates.Add(corporateStructure);
}
public void Remove(CorporateStructure corporateStructure)
{
subordinates.Remove(corporateStructure);
}
public List<CorporateStructure> GetSubordinates()
{
return subordinates;
}
public override string ToString()
{
return $"[CorporateStructure名字为:" + name + "职位:" + position + "工资:" + salary.ToString()+ "]";
}
}
}
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。