参观者模式主要对一组固定结构的对象进行访问,一般和组合模式一起使用。
abstract class Hardware{
protected double price;
protected double getPrice();
void accept(IComputerVisitor visitor);
}
class Mainboard extends Hardware{
void accept(IComputerVisitor visitor){
visitor.visitMainboard(this);
}
}
class Memory extends Hardware{
void accept(IComputerVisitor visitor){
visitor.visitMemory(this);
}
}
class Display extends Hardware(
void accept(IComputerVisitor visitor){
visitor.visitDisplay(this);
}
}
class NetworkAdapter extends Hardware{
void accept(IComputerVisitor visitor){
visitor.visitNetworkAdapter(this);
}
}
class Computer extends Hardware[
private List<Hardware> parts = new Arraylist();
public List<Hardware> add(Hardware hardware){
parts.add(hardware);
return parts;
}
public void accept(IComputerVisitor visitor){
for(Hardware h: parts){
h.accept(visitor);
}
}
}
interface IComputerVisitor{
void visitMainboard(Mainboard mainboard);
void visitNetworkAdapter(NetworkAdapter adapter);
void visitDisplay(Display display);
void visitMemory(Memory memory);
}
//遍历 computer 的每个部件,汇总价格
class PriceVisitor implements IComputerVisitor{
//总价格
private double amountPrice;
void visitMainboard(Mainboard mainboard){
amountPrice += mainboard.getPrice();
}
void visitNetworkAdapter(NetworkAdapter adapter) {
amountPrice += adapter.getPrice();
}
void visitDisplay(Display display) {
amountPrice += display.getPrice();
}
void visitMemory(Memory memory) {
amountPrice += memory.getPrice();
}
}
Client:
Computer computer = new Computer();
Mainboard mainboard = new Mainboard();
NetworkAdapter networkAdapter = new NetworkAdapter();
Display display = new Display();
Memory memory = new Memory();
computer .add(mainboad)
.add(networkAdapter)
.add(display)
.add(memory);
IComputerVisitor visitor = new PriceVisitor();
visitor.accept(computer);