12.14实验 25:访问者模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
 
1、理解访问者模式的动机,掌握该模式的结构;
 
2、能够利用访问者模式法解决实际问题。
 
 
 
[实验任务一]:打包员
 
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
 
实验要求:
 
1. 画出对应的类图;
2. 提交源代码;
3. 注意编程规范。
1、类图
 
2、源代码
package org.example;
 
public class Apple implements Product {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
 
package org.example;
 
public class Book implements Product {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
 
package org.example;
 
import java.util.ArrayList;
import java.util.List;
 
public class BuyBasket {
 
    private List<Product> products = new ArrayList();
 
    public void accept(Visitor visitor) {
        for (Product product : products) {
            product.accept(visitor);
        }
    }
 
    public void addProduct(Product p) {
        products.add(p);
    }
 
    public void removeProduct(Product p) {
        products.remove(p);
    }
}
 
package org.example;
 
public class Client {
 
    public static void main(String[] args) {
        BuyBasket buyBasket = new BuyBasket();
 
        buyBasket.addProduct(new Apple());
        buyBasket.addProduct(new Book());
 
        Visitor saler = new Saler();
        saler.setName("ax");
        System.out.println("----收银员----");
        buyBasket.accept(saler);
 
        Visitor packer = new Packer();
        packer.setName("gx");
        System.out.println("----打包员----");
        buyBasket.accept(packer);
 
        Visitor customer = new Customer();
        customer.setName("yxl");
        System.out.println("----顾客----");
        buyBasket.accept(customer);
    }
}
 
package org.example;
 
public class Customer extends Visitor {
    @Override
    public void visit(Apple apple) {
        System.out.println("顾客" + name + "选苹果");
    }
 
    @Override
    public void visit(Book book) {
        System.out.println("顾客" + name + "买书");
    }
}
 
package org.example;
 
public class Packer extends Visitor {
    @Override
    public void visit(Apple apple) {
        System.out.println("打包员" + name + "给苹果打包");
    }
 
    @Override
    public void visit(Book book) {
        System.out.println("打包员" + name + "给书打包");
    }
}
 
package org.example;
 
public interface Product {
 
    void accept(Visitor visitor);
}
 
package org.example;
 
public class Saler extends Visitor {
    @Override
    public void visit(Apple apple) {
        System.out.println("收银员" + name + "给苹果过秤,然后计算其价格");
    }
 
    @Override
    public void visit(Book book) {
        System.out.println("收银员" + name + "直接计算书的价格");
 
    }
}
 
package org.example;
 
public abstract class Visitor {
    protected String name;
 
    public void setName(String name) {
        this.name = name;
    }
 
    public abstract void visit(Apple apple);
 
    public abstract void visit(Book book);
}
 
 
3、运行截图
posted @ 2025-01-08 00:53  kxzzow  阅读(3)  评论(0)    收藏  举报