行为型设计模式:访问者模式
2021/4/20 10:26:00
本文主要是介绍行为型设计模式:访问者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
访问者模式是设计模式中最难理解的一种设计模式,代码也比较复杂。在GOF《设计模式》中ding定义如下:
Allows for one or more operation to be applied to a set of objects at runtime, decoupling the operations from the object structure.
用于一个或多个从操作应用于一组对象,解耦对象和操作。下面看一下代码。UML类图如下:
上图中,有2个访问者VisitorA和VisitorB,它们要操作一组对象,VisitableA、VisitableB和VisitableC。
访问者接口和实现类:
public interface Visitor { void visit(VisitableA visitableA); void visit(VisitableB visitableB); void visit(VisitableC visitableC); } public class VisitorA implements Visitor{ @Override public void visit(VisitableA visitableA) { System.out.println("visitorA visit A"); } @Override public void visit(VisitableB visitableB) { System.out.println("visitorA visit B"); } @Override public void visit(VisitableC visitableC) { System.out.println("visitorA visit C"); } } public class VisitorB implements Visitor{ @Override public void visit(VisitableA visitableA) { System.out.println("visitorB visit A"); } @Override public void visit(VisitableB pdfFile) { System.out.println("visitorB visit B"); } @Override public void visit(VisitableC pdfFile) { System.out.println("visitorB visit C"); } }
下面是被访问者类:
public abstract class AbstractVisitable { abstract public void accept(Visitor visitor); } public class VisitableA extends AbstractVisitable { @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class VisitableB extends AbstractVisitable { @Override public void accept(Visitor visitor) { visitor.visit(this); } } public class VisitableC extends AbstractVisitable { @Override public void accept(Visitor visitor) { visitor.visit(this); } }
上面代码中accept方法,调用了访问者来访问自己,是一个最关键的地方。
下面是应用类:
public class Application { public static void main(String[] args) { List<AbstractVisitable> abstractVisitables = new ArrayList<>(); abstractVisitables.add(new VisitableA()); abstractVisitables.add(new VisitableB()); abstractVisitables.add(new VisitableC()); VisitorB visitorB = new VisitorB(); VisitorA visitorA = new VisitorA(); for (AbstractVisitable abstractVisitable : abstractVisitables) { abstractVisitable.accept(visitorA); abstractVisitable.accept(visitorB); } } }
访问者模式的思想是让操作和操作对象解耦,如上代码,如果我们要增加一个访问操作,只需要增加一个Visitor的实现类即可。
举个实际应用的例子,我们有3组数据,分别来自不用的数据源,但是它们都是来自贷款业务的不同业务系统,具有贷款业务特性。我们现在要分别对这3组数据抽取出类似于客户、贷款额度、还款状态等类似,这样我们就可以使用上面的设计模式。把3组数据作为被访问者,抽取客户、抽取贷款额度、抽取还款状态作为访问者。
因为访问者模式实现起来比较复杂,在实际开发中使用需要谨慎。可以用策略模式来取代,比如上面的访问者改为策略接口类,接口类中定义visitA和visitB方法,根据不同被访问者实现上面的接口来定义策略类,然后策略工厂根据被访问者不同选择不同的策略类。代码如下:
public interface Strategy { void visitA(); void visitB(); } public class StrategyA implements Strategy { @Override public void visitA() { System.out.println("visitorA visit A"); } @Override public void visitB() { System.out.println("visitorB visit A"); } } public class StrategyB implements Strategy { @Override public void visitA() { System.out.println("visitorA visit B"); } @Override public void visitB() { System.out.println("visitorB visit B"); } } public class StrategyC implements Strategy { @Override public void visitA() { System.out.println("visitorA visit C"); } @Override public void visitB() { System.out.println("visitorB visit C"); } }
本文代码地址:https://github.com/jinjunzhu/design-pattern.git
个人公众号,欢迎关注,共同学习进步
这篇关于行为型设计模式:访问者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南