zoukankan      html  css  js  c++  java
  • 访问者模式——java实现

    问题描述:

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

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

    运行结果:

  • 相关阅读:
    074孤荷凌寒从零开始学区块链第74天DAPP029
    073孤荷凌寒从零开始学区块链第73天DAPP028
    iOS开发——UI进阶篇(十七)CALayer,核心动画基本使用
    iOS开发——UI进阶篇(十六)Quartz2D实战小例子
    iOS开发——UI进阶篇(十五)Quartz2D介绍
    iOS开发——UI进阶篇(十四)modal
    iOS开发——UI进阶篇(十三)UITabBarController简单使用,qq主流框架
    iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
    iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
    iOS开发——UI进阶篇(十)导航控制器、微博详情页、控制器的View的生命周期
  • 原文地址:https://www.cnblogs.com/znjy/p/15637164.html
Copyright © 2011-2022 走看看