在结构不变的情况下动态改变对于内部元素的动作
适合于结构固定,编译器
代码结构
源码
package com.myspringboot.shejimoshi.fangwenzhe;
public class Board extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitBoard(this);
}
@Override
double getPrice() {
return 200;
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
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);
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public abstract class ComputerPart {
abstract void accept(Visitor v);
abstract double getPrice();
}
package com.myspringboot.shejimoshi.fangwenzhe;
public 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;
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public class CPU extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitCpu(this);
}
@Override
double getPrice() {
return 500;
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public class Main {
public static void main(String[] args) {
Computer computer = new Computer();
PersonelVisitor personelVisitor = new PersonelVisitor();
computer.acccept(personelVisitor);
System.out.println(personelVisitor.totalPrice);
CorpVisitor corpVisitor = new CorpVisitor();
computer.acccept(corpVisitor);
System.out.println(corpVisitor.totalPrice);
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public class Memory extends ComputerPart {
@Override
void accept(Visitor v) {
v.visitMemory(this);
}
@Override
double getPrice() {
return 300;
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public 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;
}
}
package com.myspringboot.shejimoshi.fangwenzhe;
public interface Visitor {
void visitCpu(CPU cpu);
void visitMemory(Memory memory);
void visitBoard(Board board);
}