12.3
```mermaid
classDiagram
class Item {
<<interface>>
+accept(Visitor visitor)
}
class Book {
-String title
+getTitle()
+accept(Visitor visitor)
}
class Electronic {
-String name
+getName()
+accept(Visitor visitor)
}
class Visitor {
<<interface>>
+visit(Book book)
+visit(Electronic electronic)
}
class PriceCalculator {
+visit(Book book)
+visit(Electronic electronic)
}
class Packer {
+visit(Book book)
+visit(Electronic electronic)
}
class ShoppingCart {
-List~Item~ items
+addItem(Item item)
+accept(Visitor visitor)
}
Item <|.. Book
Item <|.. Electronic
Visitor <|.. PriceCalculator
Visitor <|.. Packer
ShoppingCart --> Item
Item --> Visitor
```
源码:
package Tutorial25;
import java.util.ArrayList;
import java.util.List;
// 商品接口
interface Item {
void accept(Visitor visitor);
}
// 具体商品类:书
class Book implements Item {
private String title;
public Book(String title) {
this.title = title;
}
public String getTitle() {
return title;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 具体商品类:电子产品
class Electronic implements Item {
private String name;
public Electronic(String name) {
this.name = name;
}
public String getName() {
return name;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 访问者接口
interface Visitor {
void visit(Book book);
void visit(Electronic electronic);
}
// 具体访问者:价格计算器
class PriceCalculator implements Visitor {
@Override
public void visit(Book book) {
System.out.println("Calculating price for book: " + book.getTitle());
}
@Override
public void visit(Electronic electronic) {
System.out.println("Calculating price for electronic: " + electronic.getName());
}
}
// 具体访问者:打包员
class Packer implements Visitor {
@Override
public void visit(Book book) {
System.out.println("Packing book: " + book.getTitle());
}
@Override
public void visit(Electronic electronic) {
System.out.println("Packing electronic: " + electronic.getName());
}
}
// 购物车类
class ShoppingCart {
private List<Item> items = new ArrayList<>();
public void addItem(Item item) {
items.add(item);
}
public void accept(Visitor visitor) {
for (Item item : items) {
item.accept(visitor);
}
}
}
// 测试类
public class Main {
public static void main(String[] args) {
// 创建商品
Item book1 = new Book("Java Programming");
Item electronic1 = new Electronic("Smartphone");
// 添加到购物车
ShoppingCart cart = new ShoppingCart();
cart.addItem(book1);
cart.addItem(electronic1);
// 使用价格计算器访问者
System.out.println("Price Calculation:");
Visitor priceCalculator = new PriceCalculator();
cart.accept(priceCalculator);
System.out.println();
// 使用打包员访问者
System.out.println("Packing:");
Visitor packer = new Packer();
cart.accept(packer);
}
}

浙公网安备 33010602011771号