在结构不变的情况下动态改变内部元素的动作

适合用在接口结构基本固定不变的

1616810823325-47c3689f-42fb-45f5-b574-dafaf209506c.png

实现案例

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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package com.deltaqin.designPattern.d04_visitor;


// 根据不同的访问者访问的不同商品,给不同的价格
// 计算的规则定义在访问者上面,不同访问者对从商品获得的相同的信息实现自己的逻辑
// 同一个被访问者传递给不同访问者的消息是一样的。
public class Computer {
ComputerPart cpu = new CPU();
ComputerPart memory = new Memory();
ComputerPart board = new Board();

public void acccept(Visitor v) {
this.cpu.accept(v);
this.memory.accept(v);
this.board.accept(v);
}

public static void main(String[] args) {
//将访问者传递给被访问者,被访问者根据访问者接口调用他的visit方法,并且传递自己的对象
//
//访问者收到传递过来的被访问者,在visitA内部会调用被访问者的方法以及属性得到属于自己的结果
PersonelVisitor p = new PersonelVisitor();

new Computer().acccept(p);
System.out.println(p.totalPrice);
}
}

abstract class ComputerPart {
abstract void accept(Visitor v);
//some other operations eg:getName getBrand
abstract double getPrice();
}

class CPU extends ComputerPart {

@Override
void accept(Visitor v) {
v.visitCpu(this);
}

@Override
double getPrice() {
return 500;
}
}

class Memory extends ComputerPart {

@Override
void accept(Visitor v) {
v.visitMemory(this);
}

@Override
double getPrice() {
return 300;
}
}

class Board extends ComputerPart {

@Override
void accept(Visitor v) {
v.visitBoard(this);
}

@Override
double getPrice() {
return 200;
}
}

interface Visitor {
void visitCpu(CPU cpu);
void visitMemory(Memory memory);
void visitBoard(Board board);
}

class PersonelVisitor implements Visitor {
double totalPrice = 0.0;

@Override
public void visitCpu(CPU cpu) {
totalPrice += cpu.getPrice()*0.9;
}

@Override
public void visitMemory(Memory memory) {
totalPrice += memory.getPrice()*0.85;
}

@Override
public void visitBoard(Board board) {
totalPrice += board.getPrice()*0.95;
}
}

class CorpVisitor implements Visitor {
double totalPrice = 0.0;

@Override
public void visitCpu(CPU cpu) {
totalPrice += cpu.getPrice()*0.6;
}

@Override
public void visitMemory(Memory memory) {
totalPrice += memory.getPrice()*0.75;
}

@Override
public void visitBoard(Board board) {
totalPrice += board.getPrice()*0.75;
}
}

应用