《访问者模式是啥 “妖怪”?》

127 阅读3分钟

Java 访问者模式高阶玩法,代码示例来袭!

嘿,各位后端小伙伴们!今天咱来唠唠 Java 里那超有意思的访问者模式,这玩意儿要是玩明白了,代码能变得老 “丝滑” 了,就像给你的程序加了润滑油,跑起来那叫一个顺溜。

一、访问者模式是啥 “妖怪”?

简单来说,访问者模式就像是你家里开派对,请了一堆不同类型的朋友,有吃货朋友、麦霸朋友、游戏狂魔朋友。你作为主人(也就是被访问的对象),不同朋友来你家有不同的 “玩法”,吃货朋友专注厨房找吃的,麦霸朋友直奔 KTV 设备,游戏狂魔朋友扑向游戏机。在代码世界里,这意味着你有一个数据结构(比如一个复杂的对象树),不同的 “访问者” 类可以按照自己的规则去处理这个数据结构里的元素,而不用把处理逻辑都塞到数据结构的类里。

二、高阶使用场景,让你眼前一亮

  1. 分层架构 “救星” :在大型项目分层架构里,业务逻辑层和数据持久层之间经常需要传递各种复杂的对象。比如说,业务层算出一个包含用户订单、商品详情、优惠信息的大对象,要传给持久层存数据库。用访问者模式,数据持久层就可以作为 “访问者”,按照数据库表结构的要求,精准地从这个大对象里抽取需要的数据,而业务层不用操心数据库咋存,各干各的事儿,分工明确,代码耦合度直线下降,妈妈再也不用担心我改一处代码牵一发而动全身啦!
  1. 多格式输出 “神器” :想象一下,你的程序要生成一份数据报表,既要有 HTML 格式给前端展示,又要有 PDF 格式供打印存档,还得有 Excel 格式方便数据分析人员拿去折腾。这时候,不同格式的生成器就是不同的访问者,它们访问同样的数据源头,按照各自格式的规则输出内容。新增一种格式?简单,加个新的访问者类就行,原有数据结构稳如泰山,扩展性 up up!

三、代码示例,光说不练假把式

咱来瞅瞅一个简单的 “电商商品管理” 代码示例。

首先,定义一个商品抽象类:

public abstract class Product {
    private String name;
    private double price;
    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }
    public abstract void accept(Visitor visitor);
    // 省略 get、set 方法
}

然后有具体的商品类,比如电子产品:

public class ElectronicProduct extends Product {
    private String brand;
    public ElectronicProduct(String name, double price, String brand) {
        super(name, price);
        this.brand = brand;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
    // 省略品牌相关 get、set 方法
}

再定义访问者接口:

public interface Visitor {
    void visit(ElectronicProduct electronicProduct);
    void visit(ClothingProduct clothingProduct);
}

接着是具体的访问者实现,比如计算总价的访问者:

public class TotalPriceVisitor implements Visitor {
    private double totalPrice = 0;
    @Override
    public void visit(ElectronicProduct electronicProduct) {
        totalPrice += electronicProduct.getPrice();
    }
    @Override
    public void visit(ClothingProduct clothingProduct) {
        totalPrice += clothingProduct.getPrice();
    }
    public double getTotalPrice() {
        return totalPrice;
    }
}

使用的时候:

public class Main {
    public static void main(String[] args) {
        List<Product> productList = new ArrayList<>();
        productList.add(new ElectronicProduct("手机", 5000, "华为"));
        productList.add(new ClothingProduct("T恤", 100));
        TotalPriceVisitor visitor = new TotalPriceVisitor();
        for (Product product : productList) {
            product.accept(visitor);
        }
        System.out.println("商品总价:" + visitor.getTotalPrice());
    }
}

瞧瞧,通过访问者模式,计算总价这个事儿就和商品类本身的逻辑分开了,以后要是增加商品类型或者修改计算规则,都很方便改动,是不是超酷?

小伙伴们,赶紧把访问者模式用到你的 Java 项目里试试吧,保准让你代码质量蹭蹭涨,开发效率节节高,下次写代码就跟玩游戏闯关一样轻松愉快啦!要是还有啥问题,评论区留言,咱一起探讨探讨。