组合模式案例——公司管理系统

结构图

在这里插入图片描述

公司(抽象类)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 公司管理系统__组合模式
{
    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();
    }
}

具体公司类 实现Company接口 树枝节点

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 公司管理系统__组合模式
{
    class ConcreteCompany : Company
    {
        //构造器
        public ConcreteCompany(string name) : base(name)
        {

        }
        private IList<Company> children = new List<Company>();
        //增加
        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 c in children)
            {
                c.DisPlay(depth + 2);
            }
        }
        //履行职责
        public override void LineOfDuty()
        {
            foreach (Company company in children)
            {
                company.LineOfDuty();
            }
        }
    }
}

人力资源部 树叶节点(不能向下产生分支)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 公司管理系统__组合模式
{
    class HRDPeartment : Company
    {
        //构造器
        public HRDPeartment(string name) : base(name)
        {

        }
        public override void Add(Company c)
        {

        }
        //显示
        public override void DisPlay(int depth)
        {
            Console.WriteLine(new String('-',depth) + name);
        }
        //履行职责
        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 员工招聘培训管理",name);
        }

        public override void Remove(Company c)
        {

        }
    }
}

财务部类 树叶节点(不能向下产生分支)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 公司管理系统__组合模式
{
    class FinanceDepartment : Company
    {
        public FinanceDepartment(string name) : base(name)
        {

        }
        public override void Add(Company c)
        {

        }

        public override void DisPlay(int depth)
        {
            Console.WriteLine(new String('-',depth) + name);
        }

        public override void LineOfDuty()
        {
            Console.WriteLine("{0} 公司财务收支管理",name);
        }

        public override void Remove(Company c)
        {

        }
    }
}

客户端调用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 公司管理系统__组合模式
{
    class Program
    {
        static void Main(string[] args)
        {
            ConcreteCompany root = new ConcreteCompany("北京责任有限公司");
            root.Add(new HRDPeartment("总公司人力资源部"));
            root.Add(new FinanceDepartment("总公司财务部"));

            ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
            comp.Add(new HRDPeartment("上海华东分公司资源部"));
            comp.Add(new FinanceDepartment("上海华东分公司财务部"));

            root.Add(comp);

            ConcreteCompany comp1 = new ConcreteCompany("南京办事处");
            comp1.Add(new HRDPeartment("南京办事处人力资源部"));
            comp1.Add(new FinanceDepartment("南京办事处财务部"));

            comp.Add(comp1);

            ConcreteCompany comp2 = new ConcreteCompany("杭州办事处");
            comp2.Add(new HRDPeartment("杭州办事处人力资源部"));
            comp2.Add(new FinanceDepartment("杭州办事处财务部"));

            comp.Add(comp2);

            Console.WriteLine("\n 结构图:");
            root.DisPlay(1);
            Console.WriteLine("\n 职责");
            root.LineOfDuty();

            Console.Read();
        }
    }
}

总结:组合模式定义了包含人力资源和财务部这些基本对象和分公司,办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象 而这个组合对象又可以被组合 这样不断的递归下去 客户端代码中 任何用到基本对象的地方都可以使用组合对象了。

用户不用关心到底是处理一个叶节点还是处理一个组合组件 也就用不着为定义组合而写一些判断语句了。

原创文章 37 获赞 11 访问量 2769

猜你喜欢

转载自blog.csdn.net/qq_39691716/article/details/104269878
今日推荐