/** * 版权所有 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