软件设计二十五

软件设计                  石家庄铁道大学信息学院

 

实验 25:访问者模式

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

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

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

 

 

 

 

[实验任务一]:打包员

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

实验要求:

1.  画出对应的类图;

2.  提交源代码;

//Product.java

 

public interface Product

{

    void accept(Visitor visitor);

}

 

//Apple.java

public class Apple implements Product

{

  public void accept(Visitor visitor)

  {

      visitor.visit(this);

  }   

}

//Book.java

 

public class Book implements Product

{

  public void accept(Visitor visitor)

  {

      visitor.visit(this);

  }   

}

//BuyBasket.java

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

 

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

 

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

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

 

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

 

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/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 static Object getBean2()

    {

        try

        {

            //创建文档对象

            DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();

            DocumentBuilder builder = dFactory.newDocumentBuilder();

            Document doc;                           

            doc = builder.parse(new File("src/config_packer.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;

               }

        }

}
//Main.java

public class Main {
    public static void main(String[] args) {
        Visitor visitor = (Visitor) XMLUtil.getBean(); // 从config.xml加载Visitor的实现类
       
visitor.setName("连赛轩");

        BuyBasket basket = new BuyBasket();
        basket.addProduct(new Apple());
        basket.addProduct(new Book());

        basket.accept(visitor); // 调用具体Visitor对购物车中的商品进行操作
   
}
}

 

3.  运行结果

 

 

 

 

 

 

 

 

 

 

posted @ 2024-11-27 12:12  连师傅只会helloword  阅读(7)  评论(0)    收藏  举报