24.12.19

实验 25:访问者模式

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

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

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

 

[实验任务一]:打包员

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

实验要求:

1.  画出对应的类图;

2.  提交源代码;

3. 注意编程规范。

 

  1. 类图:

 

  1. 源代码

public interface Product {

    void accept(Visitor visitor);

}

public class Apple implements Product {

    public void accept(Visitor visitor) {

        visitor.visit(this);

    }

}

 

public class Book implements Product {

    public void accept(Visitor visitor) {

        visitor.visit(this);

    }

}

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

 

public class BuyBasket {

    private List<Product> list = new ArrayList<>();

 

    public void accept(Visitor visitor) {

        Iterator<Product> i = list.iterator();

        while (i.hasNext()) {

            i.next().accept(visitor);

        }

    }

 

    public void addProduct(Product product) {

        list.add(product);

    }

 

    public void removeProduct(Product product) {

        list.remove(product);

    }

}

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

}

public class Saler extends Visitor {

    public void visit(Apple apple) {

        System.out.println("收银员 " + name + " 给苹果过秤,然后计算其价格。");

    }

 

    public void visit(Book book) {

        System.out.println("收银员 " + name + " 直接计算书的价格。");

    }

}

public class Customer extends Visitor {

    public void visit(Apple apple) {

        System.out.println("顾客 " + name + " 选苹果。");

    }

 

    public void visit(Book book) {

        System.out.println("顾客 " + name + " 买书。");

    }

}

public class Packer extends Visitor {

    public void visit(Apple apple) {

        System.out.println("打包员 " + name + " 将苹果装入保护袋。");

    }

 

    public void visit(Book book) {

        System.out.println("打包员 " + name + " 将书包装入纸箱。");

    }

}

public class XMLUtil {

    // 该方法用于从 XML 配置文件中提取具体类的类名,并返回一个实例对象

    public static Object getBean() {

        try {

            // 创建文档对象

            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = dFactory.newDocumentBuilder();

            Document doc;

            doc = builder.parse(new File("config.xml"));

 

            // 获取包含类名的文本节点

            NodeList nl = doc.getElementsByTagName("className");

            Node classNode = nl.item(0).getFirstChild();

            String cName = classNode.getNodeValue();

 

            // 通过类名生成实例对象并将其返回

            Class c = Class.forName(cName);

            Object obj = c.newInstance();

            return obj;

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        }

    }

}

public class Client {

    public static void main(String[] args) {

        // 创建产品

        Product b1 = new Book();

        Product b2 = new Book();

        Product a1 = new Apple();

 

        // 创建购物篮

        BuyBasket basket = new BuyBasket();

        basket.addProduct(b1);

        basket.addProduct(b2);

        basket.addProduct(a1);

 

        // 动态获取访问者

        Visitor visitor = (Visitor) XMLUtil.getBean();

        visitor.setName("李四");

 

        // 访问购物篮中的商品

        basket.accept(visitor);

    }

}

posted on 2024-12-19 21:02  Daniel350  阅读(1)  评论(0编辑  收藏  举报