访客模式比较抽象,不易理解。简单的通过文字、类图、案例代码,大家可能不太容易理解这个模式。不过,希望大家不要心急,静下心来,用心体会这种设计模式的魅力。我相信你会有所收获。访问者模式基本概念的基本介绍:将对元素的一些操作封装在一定的数据结构中。它的一个重要特点是可以在不改变数据结构的情况下定义一些新的操作。简单来说,访问者模式的主要作用就是将“数据结构”和“数据操作”分开,解决两者之间的耦合问题。访问者模式的基本实现原理是在被访问类中添加一个接口来接收访问者。一般来说,当我们需要对一个数据结构中的元素进行很多不同的操作,而且这些操作之间又互不相关,又想避免这些操作对这些元素造成“污染”时,可以考虑使用访客模式。访问者模式UML类图类图解释Visitor:抽象访问角色;数据结构中通常有若干个元素,类中为每个元素提供了相应的访问操作(方法)。ConcreteVisitor:具体访客角色;继承Visitor并实现其中定义的所有方法。Element:抽象元素作用;这个类定义了一个接收访问者的接受(receive)方法。ConcreteElement:具体元素作用;继承自Element并实现了其中定义的accept方法。ObjectStruture:这个类定义了数据结构(objectstructure),管理所有的元素,可以枚举它的元素(也就是遍历)。案例讲解案例:开发一个员工审批功能,具体来说,不同角色的员工可以审批“同意”和“不同意”。抽象员工类=>对应Element(抽象元素角色)publicabstractclassWorkers{//提供访问者访问的方法publicabstractvoidaccept(Actionaction);}具体员工类/***Manager*/publicclassManagerextendsWorkers{/***这里使用double分配。*第一次dispatch:将具体的Action作为参数传递给客户端中的Manager。*第二次赋值:Manager类调用Action中的具体方法,将自身作为参数传入。*/@Overridepublicvoidaccept(Actionaction){action.managerVerify(this);}}/***groupleader*/publicclassGroupLeaderextendsWorkers{@Overridepublicvoidaccept(Actionaction){action.groupLeaderVerify(this);}}抽象行为类=>对应Visitor(抽象访问角色)publicabstractclassAction{//经理批准publicabstractvoidmanagerVerify(Managermanager);//组长批准publicabstractvoidgroupLeaderVerify(GroupLeadergroupLeader);}具体行为类/***同意*/publicclassAgreeextendsAction{@OverridepublicvoidmanagerVerify(Managermanager){System.out.println("组长审核结果同意!");}@OverridepublicvoidgroupLeaderVerify(GroupLeadergroupLeader){System.out.println("组长审核结果同意!");}}/***不同意*/publicclassDisagreeextendsAction{@OverridepublicvoidmanagerVerify(Managermanager){System.out.println("组长审核结果不同意!");}@OverridepublicvoidgroupLeaderVerify(GroupLeadergroupLeader){System.out.println("组长审核结果不同意!");}}ObjectStructure类publicclassObjectStructure{//维护一个集合privateList
