设计模式(十五)——组合模式

组合模式(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.运行结果

UML图



源码下载地址 :https://gitee.com/ZhaoYongshuang/DesignPattern.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值