组合模式(Composite)—分公司与总部
2016-06-19 10:12
246 查看
组合模式(Composite)
将对象组合成树形结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。好处:组合模式让客户可以一致地使用组合结构和单个对象。
如图是一个OA系统,总公司和分公司想共用同一套机制。
公司抽象类或接口abstract class Company { protected string name; public Company (string name) { this.name = name; } public abstract void Add(Company c); public abstract void Remove(Company c); public abstract void Display(int depth); public abstract void LineOfDuty(); //履行职责 }组合对象(具体公司)
class ConcreteCompany:Company { private List<Company> children = new List<Company>(); public ConcreteCompany(string name) : base(name) { } public override void Add(Company c) { children.Add(c); } public override void Remove(Company c) { children.Remove(c); } 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(); } } }
基本对象(人力、财务)
//人力资源部与财务部 class HRDepartment:Company { public HRDepartment(string name) : base(name) { } public override void Add(Company c) { } public override void Remove(Company c) { } public override void Display(int depth) { Console.WriteLine(new string ('-',depth )+name ); } public override void LineOfDuty() { Console.WriteLine("{0}员工招聘培训管理",name ); } } //财务部 class FinanceDepartment:Company { public FinanceDepartment(string name) : base(name) { } public override void Add(Company c) { } public override void Remove(Company c) { } public override void Display(int depth) { Console.WriteLine(new string ('-',depth )+name ); } public override void LineOfDuty() { Console.WriteLine("{0}公司财务收支管理",name ); } }
客户端
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); Console.WriteLine("\n结构图:"); root.Display(1); Console.WriteLine("\n职责:"); root.LineOfDuty(); Console.Read();
相关文章推荐
- 附加作业
- CSS3变形之3D变形
- 简单几招破解Windows管理员密码
- L2-010. 排座位(并查集水题)
- 【Ionic实战】一个和AngularJS的跨平台(iOS,Android) APP框架
- 附加题
- 根据传入的数据绘制圆环,以及以绘画形式自定义图片为圆形
- [caffe]深度学习之图像分类模型AlexNet解读
- Linux 系统应用编程——网络编程(利用TCP/IP 模型分析数据传输过程)
- 沈阳航空软件工程附加
- [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated c
- 174. Dungeon Game
- 增量更新:bsdiff工具的安装和使用
- 上班之前的“踩点”--一个程序员的成长史(9)
- 【Ionic实战】自动升级Android APP
- linux dup函数源码剖析
- jstree的使用
- Arduino 卡片8震动探测
- Linux 系统应用编程——网络编程(TCP/IP 数据包格式解析)
- 附加作业