本文实例讲述了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