1. 程式人生 > >組合模式(Composite)

組合模式(Composite)

rem for remove 安全 tco fin trac roo 問題

組合模式:將對象組合成樹形結構以表示‘部分-整體’的層次結構。組合模式使得用戶對單個對象和組合對象的使用具有一致性。

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(); }
public class ConcreteCompany:Company
    {
        private IList<Company> companys = new List<Company>();
        public ConcreteCompany(string name)
            :base(name)
        {

        }
        
public override void Add(Company company) { companys.Add(company); } public override void Remove(Company company) { companys.Remove(company); } public override void Display(int depth) { Console.WriteLine(new
string(-,depth) + name); foreach(var company in companys) { company.Display(depth + 2); } } public override void LineOfDuty() { foreach(var company in companys) { company.LineOfDuty(); } } }
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);
        }
    }
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);
        }
    }
class Program
    {
        static void Main(string[] args)
        {
            Company rootCompany = new ConcreteCompany("北京總公司");
            rootCompany.Add(new HRDepartment("總公司人力資源部"));
            rootCompany.Add(new FinanceDepartment("總公司財務部"));

            Company eastCompany = new ConcreteCompany("華東分公司");
            eastCompany.Add(new HRDepartment("華東分公司人力資源部"));
            eastCompany.Add(new FinanceDepartment("華東分公司財務部"));

            rootCompany.Add(eastCompany);

            Company shanghaiCompany = new ConcreteCompany("上海辦事處");
            shanghaiCompany.Add(new HRDepartment("上海辦事處人力資源部"));
            shanghaiCompany.Add(new FinanceDepartment("上海辦事處財務部"));

            eastCompany.Add(shanghaiCompany);

            Console.WriteLine("機構圖:");
            rootCompany.Display(1);

            Console.WriteLine("職責:");
            rootCompany.LineOfDuty();
        }
    }

關於Leaf中也有add和remove。

這種方式叫做透明方式,也就是說在Component中聲明所有用來管理子對象的方法,其中包括add,remove等。這樣實現Component接口的所有子類都具備了add和remove。這樣的好處是葉節點和枝節點

對於外界沒有區別,完全一致的接口。問題是,leaf本身並不具備add和remove方法的功能,所以實現它是沒有意義的。

安全方式,也就是在Componet接口中不去聲明add和remove方法。那麽子類的leaf也就不需要去實現它,而在Composite聲明所有用來管理子類對象的方法。但是不夠透明。樹葉和樹枝將不具有相同的 接口

,客戶端的調用要做相應的判斷,帶來了不便。

什麽地方用:

當需求中是體現部分與整體層次的結構時,以及希望用戶忽略組合對象和單個對象的不同,統一的使用組合結構中的所有對象時,就考慮使用組合模式。

組合模式(Composite)