- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java使用访问者模式解决公司层级结构图问题详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
本文实例讲述了java使用访问者模式解决公司层级结构图问题。分享给大家供大家参考,具体如下:
一. 模式定义 。
访问者模式:是表示一个作用于某对象结构中各个元素的操作,它使用户可以在不改变各元素类的前提下定义作用于这些元素的新操作.
二. 模式举例 。
1 模式分析 。
我们借用公司层级结构来说明这一模式.
2 访问者模式静态类图 。
3 代码示例 。
3.1 抽象员工一staff 。
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
|
package
com.demo.structure;
import
com.demo.visitor.ivisitor;
/**
* 抽象员工类
*
* @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
accept(ivisitor visitor);
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;
}
}
|
3.2 管理者一manager 。
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
|
package
com.demo.structure;
import
java.util.arraylist;
import
com.demo.visitor.ivisitor;
/**
* 管理人员(手下有其他员工的人)
*
* @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
accept(ivisitor visitor) {
// 访问自身
visitor.visit(
this
);
// 遍历list列表中的各个元素对象,接收访问者对象
for
(
int
i =
0
; i <
this
.arraylist.size(); i++) {
if
(
this
.arraylist.get(i) ==
null
) {
continue
;
}
// 接收访问者对象
this
.arraylist.get(i).accept(visitor);
}
}
}
|
3.3 普通员工一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
34
35
36
37
38
|
package
com.demo.structure;
import
com.demo.visitor.ivisitor;
/**
* 普通员工(真正干活的人)
*
* @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
;
}
// 接收访问者对象
public
void
accept(ivisitor visitor)
{
visitor.visit(
this
);
}
}
|
3.4 访问者接口一ivisitor 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.demo.visitor;
import
com.demo.structure.employees;
import
com.demo.structure.manager;
/**
* 访问者接口
*
* @author
*
*/
public
interface
ivisitor {
// 访问管理者
public
void
visit(manager manager);
// 访问普通员工
public
void
visit(employees employees);
}
|
3.5 员工基本信息访问者一printbaseinfovistor 。
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
|
package
com.demo.visitor;
import
com.demo.structure.employees;
import
com.demo.structure.manager;
/**
* 打印基本信息访问者
*
* @author
*
*/
public
class
printbaseinfovisitor
implements
ivisitor {
/**
* 访问管理者对象
*/
public
void
visit(manager manager) {
system.out.print(
"- 管理者:"
);
manager.printuserbaseinfo();
}
/**
* 访问普通员工对象
*/
public
void
visit(employees employees) {
system.out.print(
"- 一般员工:"
);
employees.printuserbaseinfo();
}
}
|
3.6 创建统计员工薪资的访问者接口一isalaryvistor 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package
com.demo.visitor;
/**
* 计算薪资访问者
*
* @author
*
*/
public
interface
isalaryvisitor
extends
ivisitor {
// 统计管理者薪资情况
public
void
printmanagertotalsalary();
// 统计一般员工薪资情况
public
void
printemployeestotalsalary();
// 统计所有员工薪资情况
public
void
printtotalsalary();
}
|
3.7 统计员工薪资访问者实现一salaryvistor 。
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
|
package
com.demo.visitor;
import
com.demo.structure.employees;
import
com.demo.structure.manager;
/**
* 计算薪资访问者具体实现
*
* @author
*
*/
public
class
salaryvisitor
implements
isalaryvisitor {
// 管理者薪资总和
private
float
managersalary;
// 普通员工薪资总和
private
float
employeessalary;
public
salaryvisitor() {
managersalary =
0
;
employeessalary =
0
;
}
// 访问管理者
public
void
visit(manager manager) {
managersalary += manager.getsalary();
}
// 访问普通员工
public
void
visit(employees employees) {
employeessalary += employees.getsalary();
}
// 统计一般员工薪资情况
public
void
printemployeestotalsalary() {
system.out.println(
"一般员工薪资总和:"
+ employeessalary);
}
// 统计管理者薪资情况
public
void
printmanagertotalsalary() {
system.out.println(
"管理者薪资总和:"
+ managersalary);
}
// 统计所有员工薪资情况
public
void
printtotalsalary() {
system.out.println(
"员工薪资总和:"
+ (managersalary + employeessalary));
}
}
|
3.8 客户端测试一client 。
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
|
package
com.demo;
import
com.demo.structure.employees;
import
com.demo.structure.manager;
import
com.demo.structure.staff;
import
com.demo.visitor.printbaseinfovisitor;
import
com.demo.visitor.salaryvisitor;
/**
* 主应用程序
*
* @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.accept(
new
printbaseinfovisitor());
/**
* 统计员工薪资情况
*/
// 创建统计员工薪资访问者
salaryvisitor visitor =
new
salaryvisitor();
// 让大老板接受该访问者
boss.accept(visitor);
// 管理者薪资统计情况
visitor.printmanagertotalsalary();
// 一般员工薪资统计情况
visitor.printemployeestotalsalary();
// 所有员工薪资统计情况
visitor.printtotalsalary();
}
}
|
4 运行结果 。
- 管理者:-|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 管理者薪资总和:420000.0 一般员工薪资总和:15000.0 员工薪资总和:435000.0 。
三. 该模式设计原则 。
1 "开-闭"原则 。
2 单一职责原则 。
四. 使用场合 。
1 如果在一个对象结构中包含很多不同类型的对象,它们有不同的接口,而想对这些不同对象实施一些依赖于具体类的操作.
2 需要对一个对象结构中的对象进行很多不同的并且不相关操作,而想避免让这些操作与这些对象的类关联起来。访问者模式使得可以将相关操作集中起来,单独定义在一个类中.
3 当该对象结构被很多应用共享时,用访问者模式让每个应用仅包含需要用到的操作.
4 定义对象结构的类很少改变,但经常需要在此结构中定义新的操作.
五. 访问者模式静态类图 。
希望本文所述对大家java程序设计有所帮助.
原文链接:https://blog.csdn.net/chengqiuming/article/details/70139443 。
最后此篇关于Java使用访问者模式解决公司层级结构图问题详解的文章就讲到这里了,如果你想了解更多关于Java使用访问者模式解决公司层级结构图问题详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在处理这个线程:HierarchyID:HierarchyID: Get all descendants for a list of parents 我有一个使用 HierarchyID 的表,我
我是一名优秀的程序员,十分优秀!