访问者模式

访问者模式---行为型

懵懂的女人 提交于 2020-02-15 03:55:36
使用场景: (1) 如果想对一个对象结构实施一些依赖于对象结构中具体类的操作,可以使用访问者模式。 (2) 如果想对一个对象结构中的各个元素进行很多不同的而且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式。把这些操作分散到不同的访问者对象中去,每个访问者对象实现同一类功能。 (3) 如果对象结构很少变动,但是需要经常给对象结构中的元素对象定义新的操作可以使用访问者模式。 3 相关模式 (1)访问者模式和组合模式 这两个模式可以组合使用。如同前面示例的那样,通过访问者模式给组合对象预留下扩展功能的接口,使得为组合模式的对象结构添加功能非常容易。 (2)访问者模式和装饰模式 这两个模式从表面上看功能有些相似,都能够实现在不修改原对象结构的情况下修改原对象的功能。但是装饰模式更多的是实现对已有功能的加强、修改或者完全全新实现;而访问者模式更多的是实现为对象结构添加新的功能。 (3)访问者模式和解释器模式 这两个模式可以组合使用。解释器模式在构建抽象语法树的时候,是使用组合模式来构建的,也就是说解释器模式解释并执行的抽象语法树是一个组合对象结构,这个组合对象结构是很少对象结构的不同变动的,但是可能经常需要为解释器增加新的功能。解释和执行的功能,这正是访问者模式的优势所在,因此在使用释器模式的时候通常会组合访问者模式来使用。 来源: https://www.cnblogs

C#设计模式——访问者模式(Visitor Pattern)

元气小坏坏 提交于 2020-02-14 12:34:16
一、概述 由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改。对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能。 二、访问者模式 访问者模式表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。其结构图如下: Visitor为每一个ConcreteElement声明一个Visitor操作。 ConcreteVisitor实现了Visitor声明的操作,其定义的行为就是需要动态添加到ConcreteElement中的新功能。 Element定义一个以Visitor为参数的Accept操作。 ConcreteElement实现Accept操作。 ObjectStructure能枚举它的元素,可以提供一个高层接口以允许访问者访问它的元素。 访问者模式通过双重分派(double dispatch)的方法来透明的为各个类添加新的功能,第一重分派是指Accept方法的多态,第二重分派是指Visit方法的多态。 访问者模式的主要缺点在于增添新的Element子类的时候会导致Visitor类发生改变,而且随着Element子类的增加,Visitor类会越来越庞大。 三、示例 我们看一下访问者模式的简单应用。 首先定义一个公司的员工管理系统的基本员工类

访问者模式

∥☆過路亽.° 提交于 2020-02-14 11:36:30
访问者模式 访问者模式是23种设计模式中最复杂、最难理解的设计模式。访问者模式属于行为模式,将对象(被访问者)与操作(访问者)分离,适用于对象本身具有复杂结构且对象相对固定但需要频繁增加对于对象的操作的场景。访问者模式主要由被访问者和访问者组成,访问者对象通过 visit 方法访问被访问者对象,被访问者对象通过 accept 方法接受访问者的访问。具体的操作实现在访问者的 visit 方法中,被访问者的 accept 方法只用于控制访问者的对象结构访问次序和访问权限。 访问者模式中的被访问者有时配合组合模式来实现。 访问者模式用于编译器前端 访问者模式的一个典型的应用场景是编译器前端。编译的中间结果:抽象语法树(AST),是一个树形结构的复杂对象。做完词法分析和语法分析将高级语言程序转换为AST之后,需要对AST做多遍操作,包括但不限于:建立符号表、静态语法检查、转换至中间码。上述这些操作都需要遍历AST对象进行操作。使用观察者模式,将AST对象作为被访问者(配合组合模式),将编译器前端对AST的操作作为访问者,可以实现AST结构与AST操作的分离,便于功能扩展。下面以本科编译课程的作业为例说明访问者模式。由于代码过长,采用Github链接方式展示完整代码,以下代码仅为示例。 抽象语法树 AST类: decaf.tree.Tree.java . 抽象基类 Tree

访问者(Visitor Pattern )模式

一曲冷凌霜 提交于 2020-02-14 03:07:23
主要用途是对聚集采取某种操作,统一执行。 访问者模式适用于数据结构相对未定的系统,它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。 比如雇员对象,我们先只有名称、年龄、工资这些属性,可以先定义访问者类来分离结构和操作 participants The classes and/or objects participating in this pattern are: Visitor (Visitor) declares a Visit operation for each class of ConcreteElement in the object structure. The operation's name and signature identifies the class that sends the Visit request to the visitor. That lets the visitor determine the concrete class of the element being visited. Then the visitor can access the elements directly through its particular interface ConcreteVisitor (IncomeVisitor

C++设计模式-访问者模式

喜夏-厌秋 提交于 2020-02-14 01:53:16
动机 在软件构建的过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。 如何在不更改类层次结构的前提下,在运行时根据需要透明地为类层次结构上的各个类动态添加新的操作,从而避免上述问题? 模式定义 表示一个作用于某对象结构中的各元素的操作。使得可以在不改变(稳定)各元素的类的前提下定义(扩展)作用于这些元素的信操作(变化) 结构 ObjectStructure(对象结构):能够枚举它的元素,同时提供一个高层的接口以允许该访问者访问它的元素。 示例 class Visitor; class Element { public: virtual void accept(Visitor& visitor) = 0; //第一次多态辨析 virtual ~Element(){} }; class ElementA : public Element { public: void accept(Visitor &visitor) override { visitor.visitElementA(*this); } }; class ElementB : public Element { public: void accept(Visitor &visitor) override { visitor

二十六.行为型设计模式——Visitor Pattern(访问者模式)

六眼飞鱼酱① 提交于 2020-02-14 01:00:30
定义   说明一个操作执行于一个对象结构的成员(elements)中。访问者样式让你定义一个类的新操作而无须改变它操作的这些成员类。   UML类图如下:      其中类和对象的关系为:   1.Visitor(抽象访问者):为对象结构类中每一个ConcreteElement的类声明一个Visit操作。这个操作的名称及标志(signature)识别传出Visit请求给访问者的类。这就使得访问者可以解定正要被访问的元素的具体类,这样访问者就可以直接经由其特有接口访问到元素(Element)。   2.ConcreteVisitor(具体访问者):实现每个由Visitor声明的操作。每个操作实现本算法的一部分,而该算法片段乃是对应于结构中对象的类。ConcreteVisitor为该算法提供了场景并存储它的局部状态。这一状态常常在遍历该结构的过程中积累结果。   3.Element(元素):定义一个Accept操作,它以一个访问者为参数。   4.ConcreteElement(抽象具体元素):实现Accept操作,该操作以一个访问者为参数。   5.ObjectStructure(对象结构类):能枚举它的元素;可以提供一个高层的接口以允许访问者访问它的元素;可以是一个组合模式(Composite Pattern)或是一个集合,如一个列表或一个无序集合。   典型应用的顺序图如下:  

设计模式—访问者模式

纵饮孤独 提交于 2020-02-14 01:00:11
访问者模式 在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图: 主要将数据结构与数据操作分离。 主要解决: 稳定的数据结构和易变的操作耦合问题。 何时使用: 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。 如何解决: 在被访问的类里面加一个对外提供接待访问者的接口。 关键代码: 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。 应用实例: 您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。 优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。 缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。 使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类

访问者模式(Visitor)

寵の児 提交于 2020-02-14 00:59:49
访问者模式( Visitor ) 访问者模式( Visitor ) 意图 :表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下定义作用于这些元素的新操作。 应用 :作用于编译器语法树的语义分析算法。 模式结构 : 心得 : 访问者模式是要解决对对象添加新的操作和功能时候,如何尽可能不修改对象的类的一种方法。一般为对象添加功能,是需要向对象添加成员函数。但这里对对象( ConcreteElement )添加了一个统一的接口—— accept ,来接收一个访问者对象。如何把对对象的操作移出到类外,正是接收参数( Visitor )的作用。它通过调用 Visitor 的接口函数 visitConcreteElement 针对当前对象进行操作,当然,当前对象的指针需要被作为参数传递出去,以便对对象状态进行访问。这样,拥有 Element 集合的对象 ObjectStruct 只要通过遍历操作,每次调用对象的 accept 接口就可以让对象自动告诉访问者使用执行什么样的功能了。当需要为对象扩展功能时,只需要再添加一个访问者,重定义对每类对象进行访问的方式就可以了。这里涉及一个双向分派的概念,即 accept 操作的调用者( Element )是运行时多态的,而且参数 Visitor 也是运行时多态的。正是因为如此,才让用户可以通过将新添的功能封装为对象

访问者模式

吃可爱长大的小学妹 提交于 2020-02-14 00:59:09
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 介绍 意图: 主要将数据结构与数据操作分离。 主要解决: 稳定的数据结构和易变的操作耦合问题。 何时使用: 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些封装到类中。 如何解决: 在被访问的类里面加一个对外提供接待访问者的接口。 关键代码: 在数据基础类里面有一个方法接受访问者,将自身引用传入访问者。 应用实例: 您在朋友家做客,您是访问者,朋友接受您的访问,您通过朋友的描述,然后对朋友的描述做出一个判断,这就是访问者模式。 优点: 1、符合单一职责原则。 2、优秀的扩展性。 3、灵活性。 缺点: 1、具体元素对访问者公布细节,违反了迪米特原则。 2、具体元素变更比较困难。 3、违反了依赖倒置原则,依赖了具体类,没有依赖抽象。 使用场景: 1、对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。 2、需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类

设计模式(22)访问者模式

百般思念 提交于 2020-02-14 00:58:59
模式介绍 访问者模式允许我们通过将该操作表示为对象来操作对象。 因此,我们可以对所述对象进行操作而不改变那些对象的类或定义。 示例 我们有一家全市最好的餐馆,各种表现良好。领导决定给员工加薪放假,但由于某些原因,表示员工的类不能被修改。 员工类: /// <summary> /// The Element abstract class. All this does is define an Accept operation, which needs to be implemented by any class that can be visited. /// </summary> abstract class Element { public abstract void Accept(IVisitor visitor); } /// <summary> /// The ConcreteElement class, which implements all operations defined by the Element. /// </summary> class Employee : Element { public string Name { get; set; } public double AnnualSalary { get; set; } public int