Solution: The Visitor pattern creates an external class that will use the data of the cart items to compute the postage.
public interface Visitable {
void accept(Visitor visitor); // implicitly public
}
public class Book implements Visitable {
@Override public void accept(Visitor visitor) {
if (...) visitor.visit(this);
}
}
public interface Visitor {
void visit(Book book); // implicitly public
void visit(CD cd);
}
public class PostageVisitor implements Visitor {
@Override public void visit(Book book) {
this.totalPostage += ...;
}
@Override public void visit(CD cd) {
this.totalPostage += ...;
}
public void getTotalPostage() {
return this.totalPostage;
}
}
public class Client {
public double calculatePostage() {
PostageVisitor visitor = new PostageVisitor();
for (Visitable item : this.items) {
item.accept(visitor);
}
return visitor.getTotalPostage();
}
}
