• Java: Visitor Pattern


    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Case.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class Case extends Equipment
    {
    
        /**
         *
         * */
        public double price()
        {
            return 30.00;
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("Case has been visited.");
            v.visitCase(this);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Composite.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    
    import java.util.Vector;
    /**
     *
     * */
    abstract class Composite extends Equipment
    {
        /**
         *
         * */
        private Vector parts = new Vector(10);
        /**
         *
         * */
        public Composite()
        {
        }
        /**
         *
         * */
        public void add(Equipment equip)
        {
            parts.add(equip);
        }
        /**
         *
         * */
        public double price()
        {
            double total=0;
    
            for (int i=0; i < parts.size(); i++)
            {
                total += ((Equipment) parts.get(i)).price();
            }
    
            return total;
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            for (int i=0; i < parts.size(); i++)
            {
                ((Equipment) parts.get(i)).accept(v);
            }
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Cpu.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class Cpu extends Equipment
    {
        /**
         *
         * */
        public double price()
        {
            return 800.00;
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("CPU has been visited.");
            v.visitCpu(this);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Equipment.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public  abstract  class Equipment {
        /**
         *
         * */
        public abstract void accept(Visitor vis);
        /**
         *
         * */
        public abstract double price();
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc HardDisk.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class HardDisk extends Equipment
    {
    
        /**
         *
         * */
        public double price()
        {
            return 200.00;
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("HardDisk has been visited.");
            v.visitHardDisk(this);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc IntegratedBoard.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class IntegratedBoard extends Composite
    {
    
        /**
         *
         * */
        public IntegratedBoard()
        {
            super.add(new MainBoard());
            super.add(new Cpu());
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("IntegratedBoard has been visited.");
            super.accept(v);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc InventoryVisitor.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    
    import java.util.Vector;
    /**
     *
     * */
    public class InventoryVisitor extends Visitor
    {
    
        /**
         *
         * */
        private Vector inv;
        /**
         *
         * */
        public InventoryVisitor()
        {
            inv = new Vector(10,5);
        }
        /**
         *
         * */
        public int size()
        {
            return inv.size();
        }
        /**
         *
         * */
        public void visitCase(Case e)
        {
            inv.addElement(e);
        }
        /**
         *
         * */
        public void visitCpu(Cpu e)
        {
            inv.addElement(e);
        }
        /**
         *
         * */
        public void visitHardDisk(HardDisk e)
        {
            inv.addElement(e);
        }
        /**
         *
         * */
        public void visitIntegratedBoard(IntegratedBoard e)
        {
            inv.addElement(e);
        }
        /**
         *
         * */
        public void visitMainBoard(MainBoard e)
        {
            inv.addElement(e);
        }
        /**
         *
         * */
        public void visitPc(Pc e)
        {
            inv.addElement(e);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc MainBoard.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class MainBoard extends Equipment
    {
        /**
         *
         * */
        public double price()
        {
            return 100.00;
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("MainBoard has been visited.");
            v.visitMainBoard(this);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Pc.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class Pc extends Composite
    {
        /**
         *
         * */
        public Pc()
        {
            super.add(new IntegratedBoard());
            super.add(new HardDisk());
            super.add(new Case());
        }
        /**
         *
         * */
        public void accept(Visitor v)
        {
            System.out.println("Pc has been visited.");
            super.accept(v);
        }
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc PriceVisitor.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public class PriceVisitor extends Visitor{
        /**
         *
         * */
        private float total;
        /**
         *
         * */
        public PriceVisitor()
        {
            total = 0;
        }
        /**
         *
         * */
        public float value()
        {
            return total;
        }
        /**
         *
         * */
        public void visitCase(Case e)
        {
            total += e.price();
        }
        /**
         *
         * */
        public void visitCpu(Cpu e)
        {
            total += e.price();
        }
        /**
         *
         * */
        public void visitHardDisk(HardDisk e)
        {
            total += e.price();
        }
        /**
         *
         * */
        public void visitIntegratedBoard(IntegratedBoard e)
        {
            total += e.price();
        }
        /**
         *
         * */
        public void visitMainBoard(MainBoard e)
        {
            total += e.price();
        }
        /**
         *
         * */
        public void visitPc(Pc e)
        {
            total += e.price();
        }
    
    }
    

      

    /**
     * 版权所有 2022 涂聚文有限公司
     * 许可信息查看:
     * 描述:
     * 访问者模式 Visitor Pattern
     * 历史版本: JDK 14.02
     * 2022-09-12 创建者 geovindu
     * 2022-09-12 添加 Lambda
     * 2022-09-12 修改:date
     * 接口类
     * 2022-09-12 修改者:Geovin Du
     * 生成API帮助文档的指令:
     * javadoc - -encoding Utf-8 -d apidoc Visitor.java
     * Interface
     * Record
     * Annotation
     * Enum
     *
     * */
    
    
    package com.javapatterns.visitor;
    /**
     *
     * */
    public  abstract  class Visitor {
        /**
         *
         * */
        public abstract void visitCase(Case e);
        /**
         *
         * */
        public abstract void visitCpu(Cpu e);
        /**
         *
         * */
        public abstract void visitHardDisk(HardDisk e);
        /**
         *
         * */
        public abstract void visitIntegratedBoard(IntegratedBoard e);
        /**
         *
         * */
        public abstract void visitMainBoard(MainBoard e);
        /**
         *
         * */
        public abstract void visitPc(Pc e);
    
    }
    

      

    调用:

     //参观者模式
    
                PriceVisitor pv;
                InventoryVisitor iv;
                Equipment equip;
    
                equip = new Pc();
    
                pv = new PriceVisitor();
                equip.accept(pv);
                System.out.println("Price: " + pv.value() );
    
                System.out.println("\n");
                iv = new InventoryVisitor();
                equip.accept(iv);
                System.out.println("Number of parts: " + iv.size());
    

      

    输出:

    Pc has been visited.
    IntegratedBoard has been visited.
    MainBoard has been visited.
    CPU has been visited.
    HardDisk has been visited.
    Case has been visited.
    Price: 1130.0
    
    
    Pc has been visited.
    IntegratedBoard has been visited.
    MainBoard has been visited.
    CPU has been visited.
    HardDisk has been visited.
    Case has been visited.
    Number of parts: 4
    

      

  • 相关阅读:
    javascript入门教程笔记
    杭电2025
    杭电 2024
    杭电2019
    UEditor编辑器上传图片开发流程
    js操作textarea方法集合
    ueditor编辑器和at.js集成
    js分页算法
    js获取url中的参数
    第7章函数表达式笔记
  • 原文地址:https://www.cnblogs.com/geovindu/p/16743696.html
Copyright © 2020-2023  润新知