10.21

实验 25:访问者模式

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

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

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

 

[实验任务一]:打包员

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

实验要求:

1. 画出对应的类图;

2. 提交源代码;

3. 注意编程规范。

 

复制代码
Product
package com.gazikel;
public interface Product {

    void accept(Visitor visitor);
}
Product实现类
Apple
package com.gazikel;
public class Apple implements Product {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
Book
package com.gazikel;
public class Book implements Product {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}
Visitor
package com.gazikel;


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);
}
Visitor实现类
Customer
package com.gazikel;
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 + "买书");
    }
}
Packer
package com.gazikel;
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 + "给书打包");
    }
}
Saler
package com.gazikel;
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 + "直接计算书的价格");

    }
}
BuyBasket
package com.gazikel;
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);
    }
}
Client
package com.gazikel;
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("张三");
        System.out.println("----收银员----");
        buyBasket.accept(saler);

        Visitor packer = new Packer();
        packer.setName("李四");
        System.out.println("----打包员----");
        buyBasket.accept(packer);

        Visitor customer = new Customer();
        customer.setName("王五");
        System.out.println("----顾客----");
        buyBasket.accept(customer);
    }
}
复制代码

 

posted @   奶油冰激凌  阅读(3)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示