当前位置: 首页 > 科技观察

设计模式系列:本文带你领略“访客模式”的魅力

时间:2023-03-19 00:11:40 科技观察

访客模式比较抽象,不易理解。简单的通过文字、类图、案例代码,大家可能不太容易理解这个模式。不过,希望大家不要心急,静下心来,用心体会这种设计模式的魅力。我相信你会有所收获。访问者模式基本概念的基本介绍:将对元素的一些操作封装在一定的数据结构中。它的一个重要特点是可以在不改变数据结构的情况下定义一些新的操作。简单来说,访问者模式的主要作用就是将“数据结构”和“数据操作”分开,解决两者之间的耦合问题。访问者模式的基本实现原理是在被访问类中添加一个接口来接收访问者。一般来说,当我们需要对一个数据结构中的元素进行很多不同的操作,而且这些操作之间又互不相关,又想避免这些操作对这些元素造成“污染”时,可以考虑使用访客模式。访问者模式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{//维护一个集合privateListpeoples=newArrayList<>();//添加publicvoidattach(Workersworkers){peoples.add(workers);}//移除publicvoiddetach(Workersworkers){peoples.remove(workers);}//显示评估状态publicvoiddisplay(Actionaction){for(Workerspeople:peoples){people.accept(action);}}}客户端测试类publicclassClient{publicstaticvoidmain(String[]args){ObjectStructureobjectStructure=newObjectStructure();//加人objectStructure.attach(newManager());objectStructure.attach(newGroupLeader());//AgreedAgreeagree=newAgree();objectStructure.display(agree);}}执行结果汇总优点:1.访客模式符合单一职责原则2.可以解决之间的关系数据结构和数据操作耦合。3、避免了操作元件造成的污染问题。4.程序具有可扩展性,大大增加了程序的灵活性。缺点:1.由于具体元素向访问者公布了实现细节,访问者模式违反了迪米特定律。这样做会使元素更改更加困难。2.由于访问者依赖于具体元素而不是其抽象父类,该模式也违反了依赖倒置原则。总结:访问者模式适用于数据结构比较稳定,功能需求变化频繁的系统。