Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6f67f96

Browse files
author
deeper
committed
add visitor
1 parent 25a363d commit 6f67f96

File tree

8 files changed

+153
-0
lines changed

8 files changed

+153
-0
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.ruoxu.pattern.visitor;
2+
3+
import java.util.LinkedList;
4+
import java.util.List;
5+
/**
6+
* 定义当中所提到的 【对象结构】,对象结构是一个抽象描述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。
7+
*/
8+
public class BusinessReport {
9+
private List<Staff> mStaffs = new LinkedList<>();
10+
11+
public BusinessReport(){
12+
mStaffs.add(new Manager("王经理"));
13+
mStaffs.add(new Engineer("工程师-Xiaoming"));
14+
mStaffs.add(new Engineer("工程师-LiHui"));
15+
mStaffs.add(new Engineer("工程师-Jack"));
16+
mStaffs.add(new Engineer("工程师-SunMi"));
17+
}
18+
19+
public void showReport(Visitor visitor){
20+
for(Staff staff:mStaffs){
21+
staff.accept(visitor);
22+
}
23+
}
24+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.ruoxu.pattern.visitor;
2+
3+
public class CEOVisitor implements Visitor{
4+
5+
@Override
6+
public void visit(Engineer engineer) {
7+
System.out.println("工程师 :" + engineer.name + ",KPI:" + engineer.kpi);
8+
}
9+
10+
@Override
11+
public void visit(Manager manager) {
12+
System.out.println("经理 :" + manager.name + ",KPI:" + manager.kpi);
13+
}
14+
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.ruoxu.pattern.visitor;
2+
3+
public class CTOVisitor implements Visitor{
4+
5+
@Override
6+
public void visit(Engineer engineer) {
7+
System.out.println("工程师 :" + engineer.name + ",代码量:" + engineer.getCodeLines());
8+
}
9+
10+
@Override
11+
public void visit(Manager manager) {
12+
System.out.println("经理 :" + manager.name + ",产品数量:" + manager.getProducts());
13+
}
14+
15+
}

‎src/com/ruoxu/pattern/visitor/Demo.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.ruoxu.pattern.visitor;
2+
/**
3+
* 访问者模式(使用频率不高,23种设计模式中最复杂的一个)
4+
* 定义:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。
5+
*
6+
* 使用场景:
7+
* 1.对象结构比较稳定,但经常需要在此对象结构上定义新的操作
8+
* 2.需要对一个对象结构中的对象进行 很多【不同的并且不相关】的操作,而需要避免这些做操【污染】这些对象的类,也不希望在增加新操作时【污染】这些对象的类,也不希望增加新操作时修改这些类。
9+
*
10+
* 总结:大多数情况下,你并不需要访问者模式,但是当你一旦需要使用它时,那就真的需要它了。
11+
* 缺点:
12+
* 1.具体元素对访问者公布细节,违反了迪米特原则。
13+
* 2.具体元素变更时导致修改成本大
14+
* 3.违反了依赖倒置原则,为了达到【区别对待】而依赖了具体类,没有依赖抽象。
15+
*/
16+
public class Demo {
17+
public static void main(String[] args) {
18+
// 案例:年终时,公司都会给员工进行业绩考核,以此评定该员工的年终奖和晋升等等, 这些评定都是由公司高层负责。我们简单把员工分为 工程师和经理,评定人分为CEO和CTO。
19+
// 假定CEO只关注工程师的的KPI和经理的KPI,CTO只关注工程师的代码量和经理的新产品数量。
20+
BusinessReport businessReport = new BusinessReport();
21+
22+
System.out.println("=========== 给CEO看的报表 ===========");
23+
businessReport.showReport(new CEOVisitor());
24+
25+
System.out.println("\n=========== 给CTO看的报表 ===========");
26+
businessReport.showReport(new CTOVisitor());
27+
}
28+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.ruoxu.pattern.visitor;
2+
3+
import java.util.Random;
4+
/**
5+
* 具体Element,它提供接受访问方法的具体实现,通常情况下是使用访问者提供的方法来访问该元素。
6+
*/
7+
public class Engineer extends Staff{
8+
9+
public Engineer(String name) {
10+
super(name);
11+
}
12+
13+
@Override
14+
public void accept(Visitor visitor) {
15+
visitor.visit(this);
16+
}
17+
// 工程师这一年写的代码量
18+
public int getCodeLines(){
19+
return new Random().nextInt(10 * 10000);
20+
}
21+
22+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.ruoxu.pattern.visitor;
2+
3+
import java.util.Random;
4+
/**
5+
* 具体Element,它提供接受访问方法的具体实现,通常情况下是使用访问者提供的方法来访问该元素。
6+
*/
7+
public class Manager extends Staff{
8+
9+
public Manager(String name) {
10+
super(name);
11+
}
12+
13+
@Override
14+
public void accept(Visitor visitor) {
15+
visitor.visit(this);
16+
}
17+
// 一年内做的产品数量
18+
public int getProducts(){
19+
return new Random().nextInt(10);
20+
}
21+
22+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.ruoxu.pattern.visitor;
2+
import java.util.Random;
3+
/**
4+
* Element(元素接口或者抽象类),它定义一个接受访问者(accept)的方法,其意义是指每一个元素都要可以被访问者访问到。
5+
*/
6+
public abstract class Staff {
7+
public String name;
8+
// 员工kpi
9+
public int kpi;
10+
11+
public Staff(String name) {
12+
this.name = name;
13+
kpi = new Random().nextInt(10);
14+
}
15+
// 接受Visitor的访问
16+
public abstract void accept(Visitor visitor);
17+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.ruoxu.pattern.visitor;
2+
/**
3+
* Visitor(接口或者抽象类)方法个数理论应该与【元素个数 Element】是一样的。
4+
*/
5+
public interface Visitor {
6+
// 访问工程师类型
7+
void visit(Engineer engineer);
8+
// 访问经理类型
9+
void visit(Manager manager);
10+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /