Skip to content

Commit f46ebcb

Browse files
committed
设计模式-访问者模式
1 parent 2c2b297 commit f46ebcb

File tree

9 files changed

+239
-0
lines changed

9 files changed

+239
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 计算机主板具体节点
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class BoardComputerNodeImpl extends ComputerNode {
10+
@Override
11+
public void accept(Visitor visitor) {
12+
visitor.visit(this);
13+
}
14+
15+
@Override
16+
public double getPrice() {
17+
return 1000;
18+
}
19+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 计算机抽象节点
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public abstract class ComputerNode {
10+
11+
public abstract void accept(Visitor visitor);
12+
13+
/**
14+
* 原始价格
15+
* @return
16+
*/
17+
public double getPrice() {
18+
return 0;
19+
}
20+
21+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 计算机结构对象,也可以同时充当具体节点的作用
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class ComputerStructure extends ComputerNode {
10+
11+
/*ComputerNode computerNode = new CpuComputerNodeImpl();
12+
ComputerNode memoryComputerNode = new MemoryComputerNodeImpl();
13+
ComputerNode boardComputerNode = new BoardComputerNodeImpl();*/
14+
15+
protected ComputerNode[] computerNodeArray;
16+
17+
public ComputerStructure() {
18+
computerNodeArray = new ComputerNode[] {new CpuComputerNodeImpl(),
19+
new MemoryComputerNodeImpl(), new BoardComputerNodeImpl()};
20+
}
21+
22+
@Override
23+
public void accept(Visitor visitor) {
24+
/*this.computerNode.accept(visitor);
25+
this.memoryComputerNode.accept(visitor);
26+
this.boardComputerNode.accept(visitor);*/
27+
for (ComputerNode computerNode : computerNodeArray) {
28+
computerNode.accept(visitor);
29+
}
30+
// 整个结构对象,也同时充当节点的作用就需要调用
31+
visitor.visit(this);
32+
}
33+
34+
@Override
35+
public double getPrice() {
36+
// 计算机除去CPU内存主板后其他东西的总和
37+
return 1000;
38+
}
39+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 公司访问者,CPU 85折,内存7折,主板8折,其他6折
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class CorpVisitorImpl implements Visitor {
10+
11+
private double totalPrice = 0.0;
12+
13+
@Override
14+
public void visit(CpuComputerNodeImpl cpuComputerNode) {
15+
totalPrice = totalPrice + cpuComputerNode.getPrice() * 0.85;
16+
}
17+
18+
@Override
19+
public void visit(MemoryComputerNodeImpl memoryComputerNode) {
20+
totalPrice = totalPrice + memoryComputerNode.getPrice() * 0.7;
21+
}
22+
23+
@Override
24+
public void visit(BoardComputerNodeImpl boardComputerNode) {
25+
totalPrice = totalPrice + boardComputerNode.getPrice() * 0.8;
26+
}
27+
28+
/**
29+
* 总结点本身触发
30+
*
31+
* @param computerStructure
32+
*/
33+
public void visit(ComputerStructure computerStructure) {
34+
totalPrice = totalPrice * 0.6;
35+
}
36+
37+
public double getTotalPrice() {
38+
return totalPrice;
39+
}
40+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 计算机CPU具体节点
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class CpuComputerNodeImpl extends ComputerNode {
10+
@Override
11+
public void accept(Visitor visitor) {
12+
visitor.visit(this);
13+
}
14+
15+
@Override
16+
public double getPrice() {
17+
return 1500;
18+
}
19+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 访问者模式,一个购买组装电脑各种零件,对个人及公司访问者不同优惠的例子
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class Main {
10+
11+
public static void main(String[] args) {
12+
// 整个结构对象,也同时充当节点的作用
13+
ComputerStructure computerStructure = new ComputerStructure();
14+
// 个人购买
15+
PersonelVisitorImpl personelVisitor = new PersonelVisitorImpl();
16+
computerStructure.accept(personelVisitor);
17+
System.out.println(personelVisitor.getTotalPrice());
18+
// 公司购买
19+
CorpVisitorImpl corpVisitor = new CorpVisitorImpl();
20+
computerStructure.accept(corpVisitor);
21+
System.out.println(corpVisitor.getTotalPrice());
22+
}
23+
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 计算机内存条具体节点
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class MemoryComputerNodeImpl extends ComputerNode {
10+
@Override
11+
public void accept(Visitor visitor) {
12+
visitor.visit(this);
13+
}
14+
15+
@Override
16+
public double getPrice() {
17+
return 500;
18+
}
19+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 个人访问者,CPU 95折,内存8折,主板9折,其他8折
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public class PersonelVisitorImpl implements Visitor {
10+
11+
private double totalPrice = 0.0;
12+
13+
@Override
14+
public void visit(CpuComputerNodeImpl cpuComputerNode) {
15+
totalPrice = totalPrice + cpuComputerNode.getPrice() * 0.95;
16+
}
17+
18+
@Override
19+
public void visit(MemoryComputerNodeImpl memoryComputerNode) {
20+
totalPrice = totalPrice + memoryComputerNode.getPrice() * 0.8;
21+
}
22+
23+
@Override
24+
public void visit(BoardComputerNodeImpl boardComputerNode) {
25+
totalPrice = totalPrice + boardComputerNode.getPrice()* 0.9;
26+
}
27+
28+
/**
29+
* 计算机除去CPU内存主板后其他东西的总和
30+
*
31+
* @param computerStructure
32+
*/
33+
public void visit(ComputerStructure computerStructure) {
34+
totalPrice = totalPrice * 0.8;
35+
}
36+
37+
public double getTotalPrice() {
38+
return totalPrice;
39+
}
40+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.design.visitor;
2+
3+
/**
4+
* 访问者接口
5+
*
6+
* @author wliduo[i@dolyw.com]
7+
* @date 2023/2/3 17:33
8+
*/
9+
public interface Visitor {
10+
11+
void visit(CpuComputerNodeImpl cpuComputerNode);
12+
13+
void visit(MemoryComputerNodeImpl memoryComputerNode);
14+
15+
void visit(BoardComputerNodeImpl boardComputerNode);
16+
17+
void visit(ComputerStructure computerStructure);
18+
}

0 commit comments

Comments
 (0)