这里我们使用访问者模式可以达到这样的目的: <pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco,...'SUB',), ('MUL',), ('PUSH', 5), ('DIV',), ('ADD',)] 讨论 刚开始的时候你可能会写大量的if/else语句来实现, 这里<em>访问者</em>模式的好处就是通过...self, request): pass def do_POST(self, request): pass def do_HEAD(self, request): pass <em>访问者</em>模式一个缺点就是它严重依赖递归...,如果数据结构嵌套层次太深可能会有问题, 有时候会超过<em>Python</em>的递归深度限制(参考 sys.getrecursionlimit() )。
这是无量测试之道的第202篇原创 今日分享主题:Python 设计模式之访问者模式。...应用场景 1、要遍历不同的对象,根据对象进行不同的操作的场景; 2、当一个对象被多个不同对象顺次处理的情况,可以考虑使用访问者模式; 3、报表生成器也可以使用访问者模式实现,报表的数据源由多个不同的对象提供...,每个对象都是Visitor,报表这个Element顺次Accept各访问者完善并生成对象。...Python 代码实现 class Person(object): pass class Man(Person): pass class Woman(Person): pass...# print("----",meth_name) # print(self) ''' 这里讲解一下:Python
访问者模式是指作用于一个对象结构体上的元素的操作。访问者可以使用户在不改变该结构体中的类的基础上定义一个新的操作。 访问者模式的类图如图所示。 ?...可以有多种具体的访问者类,各自完成特定的目的,如一个访问者类是计算价格,另一个访问者类则是计算存货数量。因此需要定义一个抽象的访问者父类 Visitor 以及用于各种特殊目的具体的子类。...反之,如果 Element 的子类经常改变结构,例如需要增加一个新的税种,这就需要在访问者类中增加新的访问方法,因此,在这种情况下使用访问者模式代价较高,尽量不要使用访问者模式。...访问者模式的优点如下。 使得在访问者类中针对复杂类结构中的某个类添加新方法较为容易,即只需要简单地添加一个新的访问者方法即可。如果不采用访问者模式,这需要在每个类中添加一个新的方法。...访问者将相关的方法集中在一个具体的访问者类中,而其他相关的方法集中在另外一个具体的访问者类中。也就是说,访问者子类是按照方法的类型来分类的。
void vsit(CommonEmployee commonEmployee); // 定义访问部门经理 public void visit(Manager manager); } 访问者实现...{ return sex; } public void setSex(int sex){ this.sex = sex; } // 定义访问者访问...// 这里实现接口 } 最后编写场景类 public class Client{ public static void main(String[] args){ // 定义一个访问者...// 展示报表的访问者 ISVisitor showVisitor = new Visitor(); // 汇总报表的访问者 ITotalVisitor...访问者模式的核心在于定义一个方法,就像开启一个门,让访问者进入,然后在将其信息传递给访问者,由访问者执行需要产生的内容。
访问者模式 访问者模式Visitor Pattern中属于行为型模式,针对于对象结构中的元素,定义在不改变该对象的前提下访问结构中元素的新方法,元素的执行算法可以随着访问者改变而改变,主要意图在于将数据结构与数据操作分离...优点 符合单一职责原则,凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,使用访问者模式一方面符合单一职责原则,另一方面,因为被封装的操作通常来说都是易变的...扩展性良好,元素类可以通过接受不同的访问者来实现对不同操作的扩展。 缺点 具体元素对访问者公布细节,违反了迪米特原则。 具体元素变更比较困难。 违反了依赖倒置原则,依赖了具体类,没有依赖抽象。...适用环境 假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。...假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。 实现 // 以动物园模拟为例,我们有几种不同种类的动物,它们能够发出不同的声音。
访问者模式主要由:Visitor(访问者角色)、Concrete Visitor(具体访问者角色)、Element(元素角色)、Concrete Element(具体元素角色)、Object Structure...访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 具体访问者角色(Concrete Visitor): 实现每个由访问者角色(Visitor)声明的操作....访问者模式的特点及适用场合 访问者模式具有以下的几个特点: 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。 访问者模式适用于数据结构相对稳定算法又易变化的系统。...因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。 访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。...访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。 适用场合 在以下情况中我们会考虑使用访问者模式: 1.
访问者模式 基本概念 访问者模式(Visitor Pattern):封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作 主要将数据结构和数据操作分离...,解决数据结构和操作耦合性的问题 访问者模式基本的工作原理是:在被访问的类里面加一个对外提供接待访问的接口 访问者模式主要应用场景:需要对一个对象结构中的对象进行很多种不同的操作(这些操作彼此没有关联)...访问者模式的原理类图 类图分析 Visitor 是抽象访问者,为该对象结构中的ConcreteElement的每一个类声明一个visit操作 ConcreteVisitor :是一个具体的访问者 实现每个有...简单总结一下吧: 优点: 访问者模式符合单一职责原则、让程序具有优秀的扩展性、灵活性非常高 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统 缺点: 具体元素对访问者公布细节...访问者依赖的是具体元素,而不是抽象元素 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的 ----
让自己的内心藏着一条巨龙,既是一种苦刑,也是一种乐趣——雨果 今天跟着一个网站学了学访问者模式 简单来说,如果我们要在不改动现有逻辑的情况下对类进行增强,则可以使用访问者模式 真实世界类比...since 2021/7/18 15:58 */ void arrived(); /** * 访问、拜访建筑 * * @param person 访问者...3.访问者对象可以在与各种对象交互时收集一些有用的信息。 当你想要遍历一些复杂的对象结构 (例如对象树), 并在结构中的每个对象上应用访问者时, 这些信息可能会有所帮助。...缺点: 1.每次在元素层次结构中添加或移除一个类时, 你都要更新所有的访问者。...(建了个奶茶店,你得在Person、保险推销员和外卖员中都新增这个建筑) 2.在访问者同某个元素进行交互时, 它们可能没有访问元素私有成员变量和方法的必要权限。
概要 访问者模式是一种将数据结构与数据操作分离的设计模式。它允许你定义新的操作,而无需改变所操作的元素类。该模式的核心思想是,通过一个访问者类,可以访问不同类的元素,而不用关心这些元素的具体类。...实现方式: 定义访问者接口:包含多个访问方法,每个方法对应一个具体元素的访问操作。 具体元素类:实现元素接口,提供接受访问者的方法,通常是accept(Visitor visitor)方法。...具体访问者类:实现访问者接口,实现对各种具体元素的访问操作。 结构对象:包含多个元素,通常提供一个方法接受访问者,遍历所有元素并调用访问者的方法。...适用场景: 当一个对象结构包含很多类,而你希望对这些类实施一些依赖其具体类的操作时,使用访问者模式。 当需要对一个对象结构中的对象进行很多不同并且不相关的操作时,使用访问者模式。...元素类与操作分离:访问者模式将数据结构和作用于结构上的操作解耦,使得操作集合可以独立变化。 缺点: 具体元素对访问者公开:访问者模式使得具体元素对访问者公开,暴露了元素的细节,破坏了封装性。
这是23种设计模式的最后一个——访问者模式,这个模式确实不怎么好理解,不怎么好用,而且实际中也很少用到这个设计模式。...《大话设计模式》中就提到GoF四个人中有一个说过:“大多数时候你并不需要访问者模式,但当一旦你需要访问者模式时,那就是真的需要它了。”...这时,男人和女人就是相对稳定的系统,我们将男人和女人对待事物看法不同用程序代码并且用访问者模式来表达。...,在此种场景中只有男人和女人,所以这个分类相对来说是稳定的我们才能使用访问者模式。...,访问者模式确实是现实场景不常用的模式,只有用在相对稳定的分类才能尝试使用访问者模式,千万不要生搬硬套设计模式,这样只会得不偿失。
一、简介 1、访问者模式表示一个作用于某对象结构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。...2、模式中的成员角色 访问者(Visitor) :访问者抽象接口,通过visit(Element)方法访问Element(数据结构),完成对Element的操作行为。...具体访问者(ConcreteVisitor):访问者的具体实现类。 元素(Element),也就是被访问者,通过accept(Visitor)方法接受Visitor的访问。...ObjectStructure本身也可以作为被访问者。 3、UML ? 4、所属类别:行为型 二、C++程序 1 // 访问者模式.cpp : 定义控制台应用程序的入口点。...(Person *)=0; 15 //virtual void print_judgement(Person *)=0; 16 17 //被访问者抽象类 18 class Person
Visitor pattern 因为它难理解、难实现,应用它会导致代码的可读性、可维护性变差,所以,访问者模式在实际的软件开发中很少被用到,在没有特别必要的情况下,建议你不要使用访问者模式。...重构优化V4 VisitorV4:访问者接口 访问不同格式的文件 public interface VisitorV4 { void visit(PdfFileV4 pdfFileV4);...-> { resourceFileV4.visit(readerV4); resourceFileV4.visit(compressV4); }); } 总结 访问者模式的演进过程复杂
访问者模式基本介绍 基本介绍 1) 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。...2) 主要将数据结构与数据操作分离,解决 数据结构和操作耦合性问题 3) 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口 4) 访问者模式主要应用场景是:需要对一个对象结构中的对象进行很多不同操作...(这些操作彼此没有关联),同时需要避免让这些操作"污染"这些对象的类,可以选用访问者模式解决 访问者模式的原理类图 对原理类图的说明 1) Visitor 是抽象访问者,为该对象结构中的 ConcreteElement...、灵活性非常高 2) 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统 缺点 1) 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的...访问者依赖的是具体元素,而不是抽象元素 3) 因此,如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式就是比较合适的
访问者(Visitor) Intent 为一个对象结构(比如组合结构)增加新能力。...Class Diagram Visitor:访问者,为每一个 ConcreteElement 声明一个 visit 操作 ConcreteVisitor:具体访问者,存储遍历过程中的累计结果 ObjectStructure
改造角色接受演员,演员作为角色的访问者。...= new KungFuRole(); actor.act(role); 如果 Java 支持双分派,执行时还看参数的运行时类型,那么结果就正确了,就不需要将 AbsActor 改造成 Role 的访问者了
解决方案 访问者模式建议将新行为放入一个名为访问者的独立类中,而不是试图将其整合到已有类中。现在,需要执行操作的原始对象将作为参数被传递给访问者中的方法,让方法能访问对象所包含的一切必要数据。...由于该对象知晓其自身的类,因此能更自然地在访问者中选出正确的方法。它们会“接收”一个访问者并告诉其应执行的访问者方法。...现在,如果我们抽取出所有访问者的通用接口,所有已有的节点都能与我们在程序中引入的任何访问者交互。如果需要引入与节点相关的某个行为,你只需要实现一个新的访问者类即可。...该方法必须接受访问者对象作为参数。 在所有具体元素类中实现接收方法。这些方法必须将调用重定向到当前元素对应的访问者对象中的访问者方法上。 元素类只能通过访问者接口与访问者进行交互。...不过访问者必须知晓所有的具体元素类,因为这些类在访问者方法中都被作为参数类型引用。 为每个无法在元素层次结构中实现的行为创建一个具体访问者类并实现所有的访问者方法。
所以有了访问者模式,提供一个 Visitor。...抽象的员工类,有自己的一些属性 private String name; private int salary; // getter/setter // 接收一个访问者...private String job; @Override public void accept(IVisitor visitor){ // 一接收一个访问者就输出了自己的信息描述...主要的优点就是如果修改输出内容,不需要修改 Employee 这些子类,只需要修改访问者,但是同样在修改类,修改访问者也没觉得比修改被访问者高级。
访问者模式(Visitor) 访问者模式(Visitor) 意图:表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。...当需要为对象扩展功能时,只需要再添加一个访问者,重定义对每类对象进行访问的方式就可以了。...再在节点对象内部使用统一接口accept调用对应的算法即可,节点内容通过自身的对象指针传递给访问者对象。...用户只要按需创建合适的访问者类实现之,然后遍历集合对象,直接“访问”就可以了。...额外需要说明的一点是,访问者并不一定让具体元素类继承于统一的父类,从访问者抽象类也能看出,抽象类接口仅仅依赖于具体实现的类。
本文今天要讲访问者模式,就是可以使你在不改变各元素的累的前提下,定义作用于这些元素的新操作,从而可以满足不同的访问者访问的场景。 一....结构 访问者模式的基本结构如下: ?...这里涉及到的参与者有如下几种: Visitor(访问者) 声明一个或者多个访问操作 ConcreteVistor(具体的访问者) 实现Visitor声明的所有接口,也就是访问者所声明的各个访问操作。...,JSON访问者看到json格式的打印;XML访问者则看到xml格式的打印。...而使用访问者模式,增加新的操作就意味着增加一个新的访问者类,因此,变得很容易。 (2):访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个的节点类中。
访问者模式 模式动机: 对于存储在一个集合中的对象,他们可能具有不同的类型(即使有一个公共的接口),对于该集合中的对象,可以接受一类称为访问者的对象来访问,不同的访问者其访问方式也有所不同。
领取专属 10元无门槛券
手把手带您无忧上云