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

    运行结果:

  • 相关阅读:
    6. (在第五步的基础上展开)实现模板推送发送
    5. (全局唯一接口调用凭据)获取Access token
    3. openid的获取
    2. 验证服务器地址的有效性
    Java后端开发规范
    4. (自定义菜单和删除全部菜单)Springboot读取静态json文件
    Docker私有仓库搭建与部署
    Docker容器基础学习一
    运维日志切割--logrotate
    zookeeper学习
  • 原文地址:https://www.cnblogs.com/znjy/p/15637164.html
Copyright © 2011-2022 走看看