访问者模式

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

 

//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;
}
}
}

posted @   神秘人来访  阅读(24)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示