Skip to content

Instantly share code, notes, and snippets.

@adibfara
Last active October 18, 2023 09:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adibfara/0b887be5ed69d9c4405bdafa84cc0ae2 to your computer and use it in GitHub Desktop.
Save adibfara/0b887be5ed69d9c4405bdafa84cc0ae2 to your computer and use it in GitHub Desktop.
VisitorPattern
public interface ItemVisitor<T> {
T visit(Box box);
T visit(Container container);
}
public interface Item {
<T> T visit(ItemVisitor<T> itemVisitor);
}
public record Box(int size) implements Item {
@Override
public <T> T visit(ItemVisitor<T> itemVisitor) {
return itemVisitor.visit(this);
}
}
public record Container(Item[] items) implements Item {
@Override
public <T> T visit(ItemVisitor<T> itemVisitor) {
return itemVisitor.visit(this);
}
}
public class PrinterVisitor implements ItemVisitor<Void> {
@Override
public Void visit(Box box) {
System.out.print("*Box");
return null;
}
@Override
public Void visit(Container container) {
System.out.print(" Container[");
for (Item item : container.items()) {
item.visit(this);
}
System.out.print("]");
return null;
}
}
public class WeightVisitor implements ItemVisitor<Integer> {
@Override
public Integer visit(Box box) {
return box.size();
}
@Override
public Integer visit(Container container) {
int sum = 2;
for (Item item : container.items()) {
sum += item.visit(this);;
}
return sum;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment