Java 访问者模式高阶玩法,代码示例来袭!
嘿,各位后端小伙伴们!今天咱来唠唠 Java 里那超有意思的访问者模式,这玩意儿要是玩明白了,代码能变得老 “丝滑” 了,就像给你的程序加了润滑油,跑起来那叫一个顺溜。
一、访问者模式是啥 “妖怪”?
简单来说,访问者模式就像是你家里开派对,请了一堆不同类型的朋友,有吃货朋友、麦霸朋友、游戏狂魔朋友。你作为主人(也就是被访问的对象),不同朋友来你家有不同的 “玩法”,吃货朋友专注厨房找吃的,麦霸朋友直奔 KTV 设备,游戏狂魔朋友扑向游戏机。在代码世界里,这意味着你有一个数据结构(比如一个复杂的对象树),不同的 “访问者” 类可以按照自己的规则去处理这个数据结构里的元素,而不用把处理逻辑都塞到数据结构的类里。
二、高阶使用场景,让你眼前一亮
- 分层架构 “救星” :在大型项目分层架构里,业务逻辑层和数据持久层之间经常需要传递各种复杂的对象。比如说,业务层算出一个包含用户订单、商品详情、优惠信息的大对象,要传给持久层存数据库。用访问者模式,数据持久层就可以作为 “访问者”,按照数据库表结构的要求,精准地从这个大对象里抽取需要的数据,而业务层不用操心数据库咋存,各干各的事儿,分工明确,代码耦合度直线下降,妈妈再也不用担心我改一处代码牵一发而动全身啦!
- 多格式输出 “神器” :想象一下,你的程序要生成一份数据报表,既要有 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 项目里试试吧,保准让你代码质量蹭蹭涨,开发效率节节高,下次写代码就跟玩游戏闯关一样轻松愉快啦!要是还有啥问题,评论区留言,咱一起探讨探讨。