Posts 【结构型】组合模式详解
Post
Cancel

【结构型】组合模式详解

【结构型】组合模式

定义

1
2
3
4
5
6
定义:将对象组合成树形结构以表示‘部分-整体’的 层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

代理模式几个角色:
    1.抽象构件角色:组合中对象声明接口,在适当情况下,实现所有类共有的默认行为。声明一个接口用于访问和管理子部件
    2.树叶构件角色:在组合树中表示叶节点对象,叶节点没有子节点
    3.树枝构件角色:定义有子部件的那些部件的行为。存储子部件,在抽象构件角色中实现与子部件有关的操作

UML图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  _  _ _ _       _ _ _ _ _ _
 |        |     |           |
 | Client |----→| Component |←------------┐
 |_  _ _ _|     |_ _ _ _ _ _|             |
                      ↑                   |
                      |                   |
                      |                   |
            ┌----------------┐            |
            |                |            |
            |                |    children|
            |                |            |
       _ _ _| _ _        _ _ |_ _ _ _ _   |
      |    Leaf  |      | Composite    |--┘
      |_ _ _ _ _ |      |_ _ _ _ __ _ _|

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
abstract class CompanyGroup{

    protected String name;

    protected int employeeNum;


    public void setLeaderName(String name, int employeeNum){

        this.name = name;

        this.employeeNum = employeeNum;
    }

    public abstract void addSubCompany(CompanyGroup companyGroup);


    public abstract void  employeeNum();

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class company extends CompanyGroup{

    public company(String name, int num){

        super(name,num);
    }

    @override
    public void addSubCompany(CompanyGroup companyGroup){

        //Nothing do do.
    }

    @override
    public void employeeNum(){

        System.out.println(this.name+" have "+this.employeeNum+" employees.");

    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class CompanyCN extends CompanyGroup{

    private List<CompanyGroup> companyList = new ArrayList<CompanyGroup>();


    public CompanyCN(String name, int num){

        super(name,num);
    }


    @override
    public void addSubCompany(CompanyGroup companyGroup){

        companyList.add(companyGroup);
    }


    @override
    public void employeeNum(){


        for(CompanyGroup company in companyList){

            company.employeeNum();
        }

        System.out.println(this.name+" have "+this.employeeNum+" employees.");

    }


}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Client{


    public static void main(String[] args){

        CompanyGroup companyCN = new CompanyCN("ChinaCN",100);

        companyCN.add(new Company("bj",50);

        companyCN.add(new Company("sh",50);


        companyCN.employeeNum();


    }

}

运行结果:

    bj have 50 employees.

    sh have 50 employees.

    ChinaCN have 100 employees.

应用


This post is licensed under CC BY 4.0 by the author.