無廢話設計模式(8)結構型模式--組合模式

0-前言

  組合模式定義(Composite):將對象組合成樹形結構以表示「部分-總體」的層次結構。ide

                組合模式使得用戶對單個對象和組合對象的使用具備一致性;this

1-實現

1-一、簡單UML圖:spa

 

1-二、代碼實現:code

 

//一、抽象父類(公司父類)
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 extends Company
{
    private List<Company> childrenList = new ArrayList<Company>();
    public  ConcreteCompany(String  companyname)
    {
        super(companyname);
    }

    @Override
    public void Add(Company c)
    {
        childrenList.add(c);
    }

    @Override
    public void Remove(Company c)
    {
        childrenList.remove(c);
    }

    @Override
    public void Display(int depth)
    {
        for(int i=0;i<depth;i++)
        {
            System.out.print('-');
        }
        System.out.print(Name + '\n');
        for (int i = 0;i<childrenList.size();i++)
        {
            childrenList.get(i).Display(depth + 2);
        }
    }

    @Override
    public void LineofDuty()
    {
        for (int i = 0;i<childrenList.size();i++)
        {
            childrenList.get(i).LineofDuty();
        }
    }
}

//3-一、葉子節點(具體公司部門類--人力資源部)
class  HRDepartment extends Company
{
    public  HRDepartment(String  companyname)
    {
        super(companyname);
    }

    @Override
    public void Add(Company c) { }

    @Override
    public void Remove(Company c) { }

    @Override
    public void Display(int depth)
    {
        for(int i=0;i<depth;i++)
        {
            System.out.print('-');
        }
        System.out.print(Name + '\n');
    }

    @Override
    public void LineofDuty()
    {
        System.out.println(Name + ": 招聘員工");
    }
}

//3-二、葉子節點(具體公司部門類--財務部)
class  FinanceDepartment extends Company
{
    public  FinanceDepartment(String  companyname)
    {
        super(companyname);
    }

    @Override
    public void Add(Company c) { }

    @Override
    public void Remove(Company c) { }

    @Override
    public void Display(int depth)
    {
        for(int i=0;i<depth;i++)
        {
            System.out.print('-');
        }
        System.out.print(Name + '\n');
    }

    @Override
    public void LineofDuty()
    {
        System.out.println(Name + ": 發放工資");
    }

 

客戶端:對象

        ConcreteCompany  root = new ConcreteCompany("深圳總公司");
        root.Add(new HRDepartment("深圳總公司人力資源部"));
        root.Add(new FinanceDepartment("深圳總公司財務部"));

        ConcreteCompany  cp1 = new ConcreteCompany("昆明分公司");
        cp1.Add(new HRDepartment("昆明分公司人力資源部"));
        cp1.Add(new FinanceDepartment("昆明分公司財務部"));
        root.Add(cp1);

        ConcreteCompany  cp2 = new ConcreteCompany("雲大辦事處");
        cp2.Add(new HRDepartment("雲大辦事處人力資源部"));
        cp2.Add(new FinanceDepartment("雲大辦事處財務部"));
        cp1.Add(cp2);

        ConcreteCompany  cp3 = new ConcreteCompany("昆工辦事處");
        cp3.Add(new HRDepartment("昆工辦事處人力資源部"));
        cp3.Add(new FinanceDepartment("昆工辦事處財務部"));
        cp1.Add(cp3);

        System.out.println("結構圖:");
        root.Display(1);

        System.out.println("職責:");
        root.LineofDuty();

 

 

運行結果:blog

 

 

2-應用場景簡單總結

一、當體現部分與總體層次的結構時;資源

二、但願用戶能夠忽略組合對象與單個對象的不一樣,統一地使用組合結構中全部對象時;rem

相關文章
相關標籤/搜索