软件设计:实验 25:访问者模式
实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 画出对应的类图;
2. 提交源代码;
3. 注意编程规范。
1.
2.
import java.util.ArrayList;
import java.util.List;
// 元素接口
interface Element {
void accept(Visitor visitor);
}
// 具体元素:商品
class Item implements Element {
private String name;
private double price;
public Item(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 访问者接口
interface Visitor {
void visit(Item item);
}
// 计算价格访问者
class CalculatePriceVisitor implements Visitor {
private double total;
public CalculatePriceVisitor() {
this.total = 0;
}
@Override
public void visit(Item item) {
total += item.getPrice();
System.out.println("Item: " + item.getName() + ", Price: " + item.getPrice());
}
public double getTotal() {
return total;
}
}
// 显示信息访问者
class DisplayVisitor implements Visitor {
@Override
public void visit(Item item) {
System.out.println("Displaying item: " + item.getName());
}
}
// 打包员访问者
class Packer implements Visitor {
@Override
public void visit(Item item) {
System.out.println("Packing item: " + item.getName());
}
}
// 购物车
class ShoppingCart {
private List<Element> items = new ArrayList<>();
public void addElement(Element element) {
items.add(element);
}
public void accept(Visitor visitor) {
for (Element item : items) {
item.accept(visitor);
}
}
}
// 客户端代码
public class VisitorPatternDemo {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.addElement(new Item("Apple", 1.99));
cart.addElement(new Item("Banana", 0.99));
cart.addElement(new Item("Orange", 2.99));
System.out.println("Displaying items:");
cart.accept(new DisplayVisitor());
System.out.println("Calculating total price:");
CalculatePriceVisitor priceVisitor = new CalculatePriceVisitor();
cart.accept(priceVisitor);
System.out.println("Total price: " + priceVisitor.getTotal());
System.out.println("Packing items:");
cart.accept(new Packer());
}
}