24.12.01
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
-
画出对应的类图;
![image]()
-
提交源代码;
package org.test.ruanjiansheji.fangwenzhe;
import java.util.ArrayList;
import java.util.List;
// 抽象访问者
abstract class Visitor {
protected String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public abstract void visit(Apple apple);
public abstract void visit(Book book);
}
// 抽象元素
interface Product {
void accept(Visitor visitor);
}
// 具体元素:Apple
class Apple implements Product {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 具体元素:Book
class Book implements Product {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
// 对象结构
class BuyBasket {
private List
public void accept(Visitor visitor) {
for (Product product : products) {
product.accept(visitor);
}
}
public void addProduct(Product product) {
products.add(product);
}
public void removeProduct(Product product) {
products.remove(product);
}
}
// 具体访问者:Saler
class Saler extends Visitor {
@Override
public void visit(Apple apple) {
System.out.println("收银员 " + name + " 给苹果过秤,然后计算其价格。");
}
@Override
public void visit(Book book) {
System.out.println("收银员 " + name + " 直接计算书的价格。");
}
}
// 具体访问者:Customer
class Customer extends Visitor {
@Override
public void visit(Apple apple) {
System.out.println("顾客 " + name + " 选苹果。");
}
@Override
public void visit(Book book) {
System.out.println("顾客 " + name + " 买书。");
}
}
// 新增具体访问者:Packer
class Packer extends Visitor {
@Override
public void visit(Apple apple) {
System.out.println("打包员 " + name + " 给购物车中的苹果进行打包。");
}
@Override
public void visit(Book book) {
System.out.println("打包员 " + name + " 给购物车中的书本进行打包。");
}
}
// 测试代码
public class VisitorPattern {
public static void main(String[] args) {
Product b1 = new Book();
Product a1 = new Apple();
Visitor visitor1 = new Customer();
Visitor visitor2 = new Packer();
Visitor visitor3 = new Saler();
BuyBasket basket = new BuyBasket();
basket.addProduct(b1);
basket.addProduct(a1);
visitor1.setName("小明");
visitor2.setName("小张");
visitor3.setName("小王");
basket.accept(visitor1); // 顾客访问
basket.accept(visitor3); // 收银员访问
basket.accept(visitor2); // 打包员访问
}
}

- 注意编程规范。


浙公网安备 33010602011771号