访问者模式
软件设计 石家庄铁道大学信息学院
实验 25:访问者模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解访问者模式的动机,掌握该模式的结构;
2、能够利用访问者模式法解决实际问题。
[实验任务一]:打包员
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
实验要求:
1. 提交源代码,不要提交类图;
AbstractGoods.java
package ruanshe25;
public abstract class AbstractGoods implements Goods{
private String name;
private int num;
private int price;
public AbstractGoods(String name, int num,int price) {
this.name = name;
this.num = num;
this.price = price;
}
@Override
public abstract int accept(Visitor visitor);
public String getName() {
return name;
}
public int getNum() {
return num;
}
public int getPrice() {
return price;
}
}
Book.java
package ruanshe25;
public class Book extends AbstractGoods {
public Book(String name, int num, int price) {
super(name, num, price);
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
CLient.java
package ruanshe25;
public class Client {
public static void main(String[] args) {
Shoppingcar shoppingCar = new Shoppingcar();
System.out.println("全部的商品:");
shoppingCar.add(new Book("牙刷", 2, 20));
shoppingCar.add(new Book("牙膏", 1, 25));
shoppingCar.add(new Fruit("水杯", 1, 45));
shoppingCar.add(new Fruit("苹果", 8, 3));
shoppingCar.getCosts();
}
}
Fruit.java
package ruanshe25;
public class Fruit extends AbstractGoods {
public Fruit(String name, int num, int price) {
super(name, num, price);
}
@Override
public int accept(Visitor visitor) {
return visitor.visit(this);
}
}
Goods.java
package ruanshe25;
public interface Goods {
public int accept(Visitor visitor);
public String getName();
public int getNum();
public int getPrice();
}
Shoppingcar.java
package ruanshe25;
import java.util.ArrayList;
import java.util.List;
public class Shoppingcar {
private static final List<Goods> goods = new ArrayList<>();
private static final Visitor visitor = new shouyinyuan();
public void add(Goods g) {
goods.add(g);
}
public void remove(Goods g) {
goods.remove(g);
}
public int getCosts() {
int sum = 0;
int i = 1;
for (Goods g : goods) {
int c = g.accept(visitor);
System.out.println(g.getName() + ":" + c + "元");
sum = sum + c;
}
System.out.println("一共是:" + sum + " 元");
return sum;
}
public void add(Book g) {
// TODO 自动生成的方法存根
goods.add(g);
}
}
shouyinyuan.java
package ruanshe25;
public class shouyinyuan implements Visitor {
@Override
public int visit(Book book) {
int cost = book.getNum() * book.getPrice();
return cost;
}
@Override
public int visit(Fruit fruit) {
int cost = fruit.getNum() * fruit.getPrice();
return cost;
}
}
Visitor.java
package ruanshe25;
public interface Visitor {
int visit(Book book) ;
int visit(Fruit fruit);
}
2. 注意编程规范。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署