組合模式案例——公司管理系統

結構圖

在這裏插入圖片描述

公司(抽象類)

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();
        }
    }
}

總結:組合模式定義了包含人力資源和財務部這些基本對象和分公司,辦事處等組合對象的類層次結構。基本對象可以被組合成更復雜的組合對象 而這個組合對象又可以被組合 這樣不斷的遞歸下去 客戶端代碼中 任何用到基本對象的地方都可以使用組合對象了。

用戶不用關心到底是處理一個葉節點還是處理一個組合組件 也就用不着爲定義組合而寫一些判斷語句了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章