qwb0614

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  187 随笔 :: 0 文章 :: 0 评论 :: 2048 阅读

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解访问者模式的动机,掌握该模式的结构;

2、能够利用访问者模式法解决实际问题。

 
   

 


[实验任务一]:打包员

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

实验要求:

1. 提交源代码,不要提交类图;

2. 注意编程规范。

复制代码
package ruanjiansheji.shiyan25;

public class Apple implements Product {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
package ruanjiansheji.shiyan25;

public class Book implements Product{
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

package ruanjiansheji.shiyan25;

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 ruanjiansheji.shiyan25;

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("张三");

        buyBasket.accept(saler);

        Visitor packer = new Packer();
        packer.setName("李四");

        buyBasket.accept(packer);

        Visitor customer = new Customer();
        customer.setName("王五");

        buyBasket.accept(customer);
    }
}
package ruanjiansheji.shiyan25;

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 ruanjiansheji.shiyan25;

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 ruanjiansheji.shiyan25;

public interface Product {

    void accept(Visitor visitor);
}
package ruanjiansheji.shiyan25;


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 ruanjiansheji.shiyan25;





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);

}
复制代码

 

posted on   嘎嘎鸭1  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示