以OA人员管理为例:
- UML图:
- 代码实现:
public abstract class BasePeople
{
protected string Name { set; get; }
public BasePeople(string name)
{
this.Name = name;
}
/// <summary>
/// 添加下属员工
/// 1、透明模式下,可以使用该方法
/// 2、安全模式下,不需要使用这个方法,因为对于最低层级实现该方法是没有意义的
/// </summary>
/// <param name="people"></param>
public abstract void AddChild(BasePeople people);
/// <summary>
/// 自我介绍
/// </summary>
public abstract void SelfIntroduction();
}
public class Manager : BasePeople
{
public List<BasePeople> childrenList = new List<BasePeople>();
public Manager(string name) : base(name)
{
}
public override void AddChild(BasePeople people)
{
childrenList.Add(people);
}
public override void SelfIntroduction()
{
Console.WriteLine($"我是一个经理,我的名字叫{base.Name},我下面有{childrenList.Count}个员工");
}
}
public class Staff : BasePeople
{
public Staff(string name) : base(name)
{
}
public override void AddChild(BasePeople people)
{
Console.WriteLine($"我的底层员工,没有资格有下属");
throw new NotImplementedException();
}
public override void SelfIntroduction()
{
Console.WriteLine($"我是一个普通员工,我的名字叫{base.Name}");
}
}
- 调用端代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("*********************添加员工前*************************");
BasePeople manager = new Manager("马云");
manager.SelfIntroduction();
BasePeople staff1 = new Staff("Jim");
staff1.SelfIntroduction();
BasePeople staff2 = new Staff("LiLei");
staff2.SelfIntroduction();
BasePeople staff3 = new Staff("HanMeimei");
staff3.SelfIntroduction();
Console.WriteLine("*********************添加员工后*************************");
manager.AddChild(staff1);
manager.AddChild(staff2);
manager.AddChild(staff3);
manager.SelfIntroduction();
Console.ReadLine();
}
}
- 运行效果:
- 总结
组合模式,将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
代码下载地址:https://pan.baidu.com/s/1F6GYLy5EvRhvUa9yQhLIgA krgk