组合模式(Composite)
组合模式,将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
代码
1.代码如下:
公司抽象类
using System;
namespace Composite
{
//公司抽象类
public abstract class Company
{
protected string name;
public Company (string name)
{
this.name = name;
}
//添加
public abstract void Add(Company company);
//移除
public abstract void Remove(Company company);
//显示
public abstract void Display(int depth);
//履行职责
public abstract void LineOfDuty();
}
}
具体公司类
using System;
using System.Collections.Generic;
using System.Collections;
namespace Composite
{
//具体公司类(树枝节点)
public class ConcreteCompany:Company
{
private List<Company> children=new List<Company>();
public ConcreteCompany (string name):base(name)
{
}
public override void Add (Company company)
{
children.Add (company);
}
public override void Remove (Company company)
{
children.Remove (company);
}
public override void Display (int depth)
{
Console.WriteLine(new String('-',depth)+name);
foreach(Company component in children){
component.Display (depth + 2);
}
}
//履行职责
public override void LineOfDuty ()
{
foreach (Company component in children) {
component.LineOfDuty ();
}
}
}
}
人力资源部类
using System;
namespace Composite
{
//人力资源部(树叶节点)
public class HRDepartment:Company
{
public HRDepartment (string name):base(name)
{}
public override void Add (Company company)
{
}
public override void Remove (Company company)
{
}
public override void Display (int depth)
{
Console.WriteLine (new String ('-', depth) + name);
}
public override void LineOfDuty ()
{
Console.WriteLine ("{0} 员工招聘培训管理", name);
}
}
}
财务部类
using System;
namespace Composite
{
//财务部(树叶节点)
public class FinanceDepartment:Company
{
public FinanceDepartment (string name):base(name)
{
}
public override void Add (Company company)
{
}
public override void Remove (Company company)
{
}
public override void Display (int depth)
{
Console.WriteLine (new String ('-', depth) + name);
}
public override void LineOfDuty ()
{
Console.WriteLine ("{0} 公司财务收支管理", name);
}
}
}
2.客户端代码如下:
客户端
using System;
namespace Composite
{
class MainClass
{
public static void Main (string[] args)
{
ConcreteCompany root = new ConcreteCompany ("北京总公司");
root.Add (new HRDepartment ("总公司人力资源部"));
root.Add (new FinanceDepartment ("总公司财务部"));
ConcreteCompany comp = new ConcreteCompany ("上海华东分公司");
comp.Add (new HRDepartment ("华东分公司人力资源部"));
comp.Add (new FinanceDepartment ("华东分公司财务部"));
root.Add (comp);
ConcreteCompany comp1 = new ConcreteCompany ("南京办事处");
comp1.Add (new HRDepartment ("南京办事处人力资源部"));
comp1.Add (new FinanceDepartment ("南京办事处财务部"));
comp.Add (comp1);
ConcreteCompany comp2 = new ConcreteCompany ("杭州办事处");
comp2.Add (new HRDepartment ("杭州办事处人力资源部"));
comp2.Add (new FinanceDepartment ("杭州办事处财务部"));
comp.Add (comp2);
Console.WriteLine ("\n结构图:");
root.Display (1);
Console.WriteLine ("\n职责:");
root.LineOfDuty ();
}
}
}
3.运行结果