import java.util.ArrayList;
import java.util.List;
/**
* {@link <a href=
* "https://[Log in to view URL]"
* target= "_blank"></a>}
*
* @author itammb ( Italia Massimiliano Buscati )
* @version JDK 1.15
*
*/
class Main {
interface ShoppingCartVisitor {
double visit(Book book);
double visit(Electronic electronic);
}
public static class DiscountCalculator implements ShoppingCartVisitor {
@Override
public double visit(Book book) {
double discount = book.getPrice() > 50 ? 10 : 5;
double finalPrice = book.getPrice() - discount;
System.out.println("Book: " + book.getTitle() + " final price: " + finalPrice);
return finalPrice;
}
@Override
public double visit(Electronic electronic) {
double discount = electronic.getPrice() * 0.1;
double finalPrice = electronic.getPrice() - discount;
System.out.println("Electronic Item: " + electronic.getName() + " final price: " + finalPrice);
return finalPrice;
}
}
interface Product {
double accept(ShoppingCartVisitor visitor);
}
public static class Electronic implements Product {
private String name;
private double price;
public Electronic(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
@Override
public double accept(ShoppingCartVisitor visitor) {
return visitor.visit(this);
}
}
public static class Book implements Product {
private String title;
private double price;
public Book(String title, double price) {
this.title = title;
this.price = price;
}
public String getTitle() {
return title;
}
public double getPrice() {
return price;
}
@Override
public double accept(ShoppingCartVisitor visitor) {
return visitor.visit(this);
}
}
public static class ShoppingCart {
private List<Product> products = new ArrayList<>();
public void addProduct(Product product) {
products.add(product);
}
public double calculateTotal(ShoppingCartVisitor visitor) {
double sum = 0;
for (Product product : products) {
sum += product.accept(visitor);
}
return sum;
}
}
public static void main(String args[]) {
// Unit test - uso del design pattern: visitor
ShoppingCart cart = new ShoppingCart();
cart.addProduct(new Book("Design Patterns", 60));
cart.addProduct(new Electronic("Laptop", 800));
cart.addProduct(new Book("Clean Code", 40));
ShoppingCartVisitor discountCalculator = new DiscountCalculator();
double totalPrice = cart.calculateTotal(discountCalculator);
System.out.println("Total Cart Price after Discount: " + totalPrice);
}
}
To embed this project on your website, copy the following code and paste it into your website's HTML: