访问者模式

📅 发布时间:2026/7/12 8:06:20 👁️ 浏览次数:
访问者模式
分派单分派 single dispatch只根据接收者对象的实际类型决定只根据一个维度去决定调用哪个方法就是单分派双分派 double dispatch根据两个对象的类型决定行为,比如行为f(订单类型,操作类型)不同的订单类型比如普通订单或者国际订单不同的操作类型比如计算价格计算税费生成发票这些订单类型和操作类型组合起来执行的方法都是不同的 普通的多态做不到在java中可以使用访问者模式…模拟双分派访问者模式Visitor Pattern : 一种行为型的设计模式把数据结构和作用于数据结构的操作,分离开来就是可以处理不同的数据 可以对每一种数据指定不同的处理模式适用于数据结构长期不变或者变化很小需要扩展操作的如果不用访问者模式每一次的扩展都要去修改接口如果用访问者模式,直接实现一个访问者的操作类就好了例子 对相同的数据处理为不同的文件pdftxthtmlpublicinterfaceItem{// 每个元素接收访问者voidaccept(Visitorvisitor);}publicinterfaceVisitor{voidvisit(ConcreteItempdfElement);}实体对象AllArgsConstructorNoArgsConstructorDatapublicclassConcreteItemimplementsItem{privateStringcontent;Overridepublicvoidaccept(Visitorvisitor){visitor.visit(this);}}访问者publicclassPdfVisitorimplementsVisitor{Overridepublicvoidvisit(ConcreteItempdfElement){// 把每个Item都做pdf处理StringcontentpdfElement.getContent();System.out.println(content被转换成了pdf....);}}publicclassTxtVisitorimplementsVisitor{Overridepublicvoidvisit(ConcreteItempdfElement){System.out.println(pdfElement.getContent()转换成了 txt...);}}测试publicclassDemo{publicstaticvoidmain(String[]args){ConcreteItemconcreteItemnewConcreteItem(waterkid);PdfVisitorpdfVisitornewPdfVisitor();TxtVisitortxtVisitornewTxtVisitor();concreteItem.accept(pdfVisitor);concreteItem.accept(txtVisitor);}}订单系统复杂一点的订单系统比如订单类型有很多种(普通订单/优惠订单/国际订单)这种订单的类型非常稳定几年都不会更改但是会不断新增 对订单的操作计算价格计算税费生成发票导出报表统计销售数据风控校验序列化导出生成物流信息等并且未来还会继续追加不同的访问者就可以使用访问者模式公众号