访问者模式(Visitor Pattern):电商平台商品访问统计实战案例分析

550 阅读4分钟

image.png

肖哥弹架构 跟大家“弹弹” 业务中设计模式的使用,需要代码关注

欢迎 点赞,点赞,点赞。

关注公号Solomon肖哥弹架构获取更多精彩内容

在电商平台中,需要对商品进行多种操作,例如计算总价、库存盘点、生成报表等。这些操作可能会随着业务的发展而增加,但商品本身不应对这些操作负责。

2. 为什么要使用访问者设计模式

访问者模式允许将数据结构(商品)与在其上执行的操作(访问者)分离,使得增加新的操作变得容易,而不需要修改现有的数据结构。

3. 标准访问者设计模式图

4. 业务访问者设计模式图

5. 业务代码参考


    // 商品接口
    interface Product {
        void accept(ProductVisitor visitor);
    }

    // 电子产品类
    class Electronics implements Product {
        private String name;
        private double price;
        private int stock;

        // 构造函数、getter 和 setter

        @Override
        public void accept(ProductVisitor visitor) {
            visitor.visit(this);
        }

        public void specificElectronicsOperation() {
            // 电子产品特定操作
        }
    }

    // 服装类
    class Clothing implements Product {
        private String name;
        private double price;
        private int stock;

        // 构造函数、getter 和 setter

        @Override
        public void accept(ProductVisitor visitor) {
            visitor.visit(this);
        }

        public void specificClothingOperation() {
            // 服装特定操作
        }
    }

    // 商品访问者接口
    interface ProductVisitor {
        void visit(Electronics electronics);
        void visit(Clothing clothing);
    }

    // 价格计算访问者
    class PriceCalculator implements ProductVisitor {
        @Override
        public void visit(Electronics electronics) {
            // 计算电子产品价格
            System.out.println("电子产品价格: " + electronics.price);
        }

        @Override
        public void visit(Clothing clothing) {
            // 计算服装价格
            System.out.println("服装价格: " + clothing.price);
        }
    }

    // 库存检查访问者
    class InventoryChecker implements ProductVisitor {
        @Override
        public void visit(Electronics electronics) {
            // 检查电子产品库存
            System.out.println("电子产品库存: " + electronics.stock);
        }

        @Override
        public void visit(Clothing clothing) {
            // 检查服装库存
            System.out.println("服装库存: " + clothing.stock);
        }
    }

    // 客户端使用
    class ECommercePlatform {
        public static void main(String[] args) {
            List<Product> products = new ArrayList<>();
            products.add(new Electronics("手机", 2999.00, 50));
            products.add(new Clothing("T恤", 99.00, 100));

            ProductVisitor priceCalculator = new PriceCalculator();
            ProductVisitor inventoryChecker = new InventoryChecker();

            for (Product product : products) {
                product.accept(priceCalculator);
                product.accept(inventoryChecker);
            }
        }
    }

6. 使用访问者设计模式的好处

  • 分离数据结构与操作:商品类不需要知道具体操作的细节。
  • 扩展性:新增操作时,只需新增访问者类,不需要修改商品类。

7. 其他使用访问者设计模式场景参考

  • 代码编辑器:对不同类型的代码元素执行不同的操作。
  • 报表生成:对数据集合中的不同数据项执行汇总和统计。

8. 可参考开源框架

  • ANTLR:一个强大的解析器生成器,使用访问者模式来处理不同的语法结构。

总结

访问者模式提供了一种将数据结构与操作分离的方法,使得对数据结构的操作更加灵活和易于扩展。

历史热点文章