1. 概念
表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作,它使我們可以在不改變?cè)氐念惖那疤嵯露x作用于這些元素的新操作。
2. 適用場(chǎng)景
對(duì)于存儲(chǔ)在一個(gè)集合中的對(duì)象,它們可能具有不同的類型(即使有一個(gè)公共的接口),對(duì)于該集合中的對(duì)象,可以接受一類稱為訪問(wèn)者的對(duì)象來(lái)訪問(wèn),不同的訪問(wèn)者其訪問(wèn)的方式也有所不同。
工作中很少適用到
3. 代碼分析

屏幕快照 2021-01-20 下午2.32.50.png
故事原型是這樣的:在中關(guān)村攢電腦,假如組裝一臺(tái)電腦所需的部件有{cpu, 內(nèi)存, 主板}三部分組成,而針對(duì)不同的團(tuán)體時(shí),電腦的不同的零部件優(yōu)惠力度有所不同。
- ComputerPart - 電腦的各部件抽象:
abstract class ComputerPart {
// 每個(gè)部件接收來(lái)訪者
abstract void accept(Visitor v);
// 各部件的定價(jià)
abstract double getPrice();
}
- Visitor - 各階層的訪問(wèn)者,對(duì)各部件的不同操作抽象:
interface Visitor {
void visitCpu(CPU cpu);
void visitMemory(Memory memory);
void visitBoard(Board board);
}
- CPU/Memory/Board - 各部件:
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;
}
}
- PersonelVisitor - 個(gè)人訪問(wèn)者對(duì)各部件的操作:
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;
}
}
- Computer - 成品電腦:
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);
}
}
- 場(chǎng)景:
public static void main(String[] args) {
PersonelVisitor p = new PersonelVisitor();
new Computer().acccept(p);
System.out.println(p.totalPrice);
}
代碼分析:使用訪問(wèn)模式組織代碼后,避免了各部件中根據(jù)不同的團(tuán)體if else的判斷,來(lái)區(qū)分不同的優(yōu)惠力度。而是通過(guò)實(shí)現(xiàn)Visitor接口,從而將不同階層的人員對(duì)各部件的操作抽取出來(lái)。Computer與實(shí)現(xiàn)各ComputerPart的類結(jié)構(gòu)就固定下來(lái)。
如果子結(jié)構(gòu)(部件)的數(shù)量不確定,那么此模式不適合。
4. 總結(jié)
- 此模式適合子結(jié)構(gòu)數(shù)量確定的情況
- 主要用于編譯器的設(shè)計(jì)
————————————————————
坐標(biāo)帝都,白天上班族,晚上是知識(shí)的分享者
如果讀完覺(jué)得有收獲的話,歡迎點(diǎn)贊加關(guān)注