问题描述:
在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。
Java源代码:
//Product.java package shiyan25; public interface Product { void accept(Visitor visitor); } //Apple.java package shiyan25; public class Apple implements Product { public void accept(Visitor visitor) { visitor.visit(this); } } //Book.java package shiyan25; public class Book implements Product { public void accept(Visitor visitor) { visitor.visit(this); } } //BuyBasket.java package shiyan25; import java.util.*; public class BuyBasket { private ArrayList list=new ArrayList(); public void accept(Visitor visitor) { Iterator i=list.iterator(); while(i.hasNext()) { ((Product)i.next()).accept(visitor); } } public void addProduct(Product product) { list.add(product); } public void removeProduct(Product product) { list.remove(product); } } //Customer.java package shiyan25; public class Customer extends Visitor { public void visit(Apple apple) { System.out.println("顾客" + name + "选苹果。"); } public void visit(Book book) { System.out.println("顾客" + name + "买书。"); } } //Packer.java package shiyan25; public class Packer extends Visitor { @Override public void visit(Apple apple) { // TODO 自动生成的方法存根 System.out.println("打包员" + name + "给购物车中的苹果打包。"); } @Override public void visit(Book book) { // TODO 自动生成的方法存根 System.out.println("打包员" + name + "给购物车中的书本打包。"); } } //Saler.java package shiyan25; public class Saler extends Visitor { public void visit(Apple apple) { System.out.println("收银员" + name + "给苹果过秤,然后计算其价格。"); } public void visit(Book book) { System.out.println("收银员" + name + "直接计算书的价格。"); } } //Visitor.java package 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); } //XMLUtil.java package shiyan25; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 public static Object getBean() { try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/shiyan25/config.xml")); //获取包含类名的文本节点 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c=Class.forName("shiyan25."+cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } public static Object getBean2() { try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/shiyan25/config_packer.xml")); //获取包含类名的文本节点 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c=Class.forName("shiyan25."+cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } }
运行结果: