24.12.01

[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:

  1. 画出对应的类图;
    image

  2. 提交源代码;

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 products = new ArrayList<>();

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); // 打包员访问
}

}

image

  1. 注意编程规范。
posted @ 2024-12-01 17:18  起名字真难_qmz  阅读(12)  评论(0)    收藏  举报