本文实例讲述了java使用组合模式实现表示公司组织结构功能。分享给大家供大家参考,具体如下:
一、模式定义
组合模式:将对象组合成树形结构以表示“部分一整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
二、组合模式举例
1 模式分析
我们借用公司组织结构图来说明这一模式。
经过分析后,我们得出该模式静态类图如下:
2 代码示例
2.1 建立员工抽象类
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
package com.demo.composite; /** * 职工类接口 * * @author * */ public abstract class staff { // 员工号 protected string no; // 职工名字 protected string name; // 职位 protected string position; // 薪资 protected float salary; // 私有属性 长度字符串 private int length; // 构造方法 public staff(string no, string name, string position, float salary) { this .no = no; this .name = name; this .position = position; this .salary = salary; // 计算总字节长度 this .length += (no == null || "" .equals(no.trim())) ? 0 : no.getbytes().length; this .length += (name == null || "" .equals(name.trim())) ? 0 : name .getbytes().length; this .length += (position == null || "" .equals(position.trim())) ? 0 : position.getbytes().length; this .length += string.valueof(salary).getbytes().length; } // 获得用户基本信息 public void printuserbaseinfo() { system.out.println( "|" + this .no + " " + this .name + " " + this .position + " " + this .salary); } // 添加员工信息 public abstract void add(staff staff); // 删除员工 public abstract staff remove(string no); // 打印员工信息 public abstract void printemployeesinfo( int layer); // 打印若干字符 protected void printchar( int layer) { for ( int j = 0 ; j < layer * 2 ; j++) { system.out.print( "-" ); } } // 私有方法打印一行 protected void printline() { system.out.print( "+" ); for ( int i = 0 ; i < this .length + 4 ; i++) { system.out.print( "-" ); } system.out.println( "-" ); } public string getno() { return no; } public void setno(string no) { this .no = no; } public string getname() { return name; } public void setname(string name) { this .name = name; } public string getposition() { return position; } public void setposition(string position) { this .position = position; } public float getsalary() { return salary; } public void setsalary( float salary) { this .salary = salary; } } |
2.2 创建管理者
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package com.demo.composite.sub; import java.util.arraylist; import com.demo.composite.staff; /** * 管理人员(手下有其他员工的人) * * @author * */ public class manager extends staff { // 存储手下员工信息 private final arraylist<staff> arraylist = new arraylist<staff>(); // 构造方法 public manager(string no, string name, string position, float salary) { super (no, name, position, salary); } /** * 增加一个员工 */ @override public void add(staff staff) { this .arraylist.add(staff); } /** * 删除员工信息 */ @override public staff remove(string no) { staff staff = null ; if (no != null && ! "" .equals(no.trim())) { for ( int i = 0 ; i < this .arraylist.size(); i++) { if ( this .arraylist.get(i) == null ) { continue ; } if (no.equals( this .arraylist.get(i).getno())) { staff = this .arraylist.remove(i); break ; } } } return staff; } /** * 打印员工信息 */ @override public void printemployeesinfo( int layer) { int tmplayer = ++layer; for ( int i = 0 ; i < this .arraylist.size(); i++) { if ( this .arraylist.get(i) == null ) { continue ; } // 打印'-' printchar(tmplayer); // 打印员工基本信息 this .arraylist.get(i).printuserbaseinfo(); // 打印手下员工信息 this .arraylist.get(i).printemployeesinfo(tmplayer); } } } |
2.3 创建普通员工
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
34
35
36
37
38
39
40
41
|
package com.demo.composite.sub; import com.demo.composite.staff; /** * 普通员工(真正干活的人) * * @author * */ public class employees extends staff { // 构造方法 public employees(string no, string name, string position, float salary) { super (no, name, position, salary); } /** * 添加员工信息 */ @override public void add(staff staff) { return ; } /** * 删除员工信息 */ @override public staff remove(string no) { // 直接返回null return null ; } /** * 打印员工信息 */ @override public void printemployeesinfo( int layer) { return ; } } |
2.4 客户端测试
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
package com.demo; import com.demo.composite.staff; import com.demo.composite.sub.employees; import com.demo.composite.sub.manager; /** * 主应用程序 * * @author * */ public class client { /** * @param args */ public static void main(string[] args) { // 公司ceo staff boss = new manager( "1" , "大老板" , "ceo" , 100000 ); /** * ceo手下有若干部门经理 */ // 财务部经理 staff financemanager = new manager( "11" , "张总" , "财务部经理" , 60000 ); // 人事部经理 staff personnelmanager = new manager( "12" , "王总" , "人事部经理" , 60000 ); // 技术部经理 staff technicalmanager = new manager( "13" , "陈总" , "技术部经理" , 60000 ); /** * 技术部门还有助理和若干主管 */ // 技术部门助理 staff deptassistant = new manager( "1301" , "王助理" , "部门助理" , 20000 ); // 技术部门主管1 staff deptmanager1 = new manager( "1302" , "主管1" , "技术主管" , 30000 ); /** * 技术主管deptmanager1 下面还有软件工程师(最终干活的人) */ staff softwareengineer1 = new employees( "1302001" , "张三" , "软件工程师" , 5000 ); staff softwareengineer2 = new employees( "1302002" , "李四" , "软件工程师" , 5500 ); staff softwareengineer3 = new employees( "1302003" , "王五" , "软件工程师" , 4500 ); // 为技术主管1添加员工信息 deptmanager1.add(softwareengineer1); deptmanager1.add(softwareengineer2); deptmanager1.add(softwareengineer3); // 技术部门主管2 staff deptmanager2 = new manager( "1303" , "主管2" , "技术主管" , 30000 ); // 为技术部经理 添加:部门助理、技术主管1和技术主管2 technicalmanager.add(deptassistant); technicalmanager.add(deptmanager1); technicalmanager.add(deptmanager2); // 市场部经理 staff marketingmanager = new manager( "14" , "吴总" , "市场部经理" , 60000 ); // 为ceo 添加:财务部经理、人事部经理、技术部经理和市场部经理 boss.add(financemanager); boss.add(personnelmanager); boss.add(technicalmanager); boss.add(marketingmanager); // 打印ceo 信息 boss.printuserbaseinfo(); // 打印ceo 手下员工信息 boss.printemployeesinfo( 1 ); } } |
运行结果如下:
|1 大老板 ceo 100000.0
----|11 张总 财务部经理 60000.0
----|12 王总 人事部经理 60000.0
----|13 陈总 技术部经理 60000.0
------|1301 王助理 部门助理 20000.0
------|1302 主管1 技术主管 30000.0
--------|1302001 张三 软件工程师 5000.0
--------|1302002 李四 软件工程师 5500.0
--------|1302003 王五 软件工程师 4500.0
------|1303 主管2 技术主管 30000.0
----|14 吴总 市场部经理 60000.0
三、该模式设计原则
1 统一对待个别对象和组合对象
2 面向抽象编程
四、使用场合
1 想表示对象的“部分一整体”层次结构的时候。
2 希望用户忽略组合对象与单个对象的不同,用户将统一使用组合结构中所有对象的时候。
组合模式的静态类图如下
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/chengqiuming/article/details/70139251