访问者模式(Visitor)

这篇具有很好参考价值的文章主要介绍了访问者模式(Visitor)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

访问者模式是一种行为设计模式,可封装一些作用于当前数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

Visitor is a behavior design pattern that encapsulates some operations that act on the elements of the current 
data structure. It can define new operations that act on these elements without changing the data structure.  

结构设计

访问者模式包含如下角色:
Visitor,访问者基类,声明了一系列以对象结构的具体元素为参数的访问者方法。这些方法的名称可能是相同的,但是其参数一定是不同的。
ConcreteVisitor,具体访问者,会为不同的具体元素类实现相同行为的几个不同版本。
ObjectStructure,对象结构类,该类能枚举它包含的元素,可以提供一个高层的接口以允许访问者访问它的元素。
Element,元素,声明了一个方法来“接收”(accept)访问者。该方法必须有一个参数被声明为访问者接口类型。
ConcreteElement,具体元素,实现Element声明的接口。该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法。
Client,客户端,客户端通常不知晓所有的具体元素类,因为它们会通过抽象接口与集合中的对象进行交互。
访问者模式类图表示如下:
访问者模式(Visitor),设计模式,# 行为型,访问者模式
访问者模式可将数据结构与数据操作分离,可以解决稳定的数据结构和易变的操作耦合问题。

伪代码实现

接下来将使用代码介绍下访问者模式的实现。

// 1、访问者基类,声明了对对象结构的具体元素为参数的访问者方法
public interface IVisitor {
    void visitElement(ConcreteElementA element);

    void visitElement(ConcreteElementB element);
}

//2、具体访问者,为不同的具体元素类实现相同行为的几个不同版本
public class ConcreteVisitorA implements IVisitor {
    @Override
    public void visitElement(ConcreteElementA element) {
        System.out.println("handle a ConcreteElementA instance in ConcreteVisitorA");
    }

    @Override
    public  void visitElement(ConcreteElementB element) {
        System.out.println("handle a ConcreteElementB instance in ConcreteVisitorA");
    }
}
public class ConcreteVisitorB implements IVisitor {
    @Override
    public void visitElement(ConcreteElementA element) {
        System.out.println("handle a ConcreteElementA instance in ConcreteVisitorB");
    }

    @Override
    public  void visitElement(ConcreteElementB element) {
        System.out.println("handle a ConcreteElementB instance in ConcreteVisitorB");
    }
}

// 3、元素,声明了一个方法来“接收”(accept)访问者。该方法必须有一个参数被声明为访问者接口类型
public interface IElement {
    void accept(IVisitor visitor);
}

// 4、具体元素,实现Element声明的接口
public class ConcreteElementA implements IElement {
    public void accept(IVisitor visitor) {
        visitor.visitElement(this);
    }
}
public class ConcreteElementB implements IElement {
    public void accept(IVisitor visitor) {
        visitor.visitElement(this);
    }
}

// 5、对象结构类,可枚举它包含的元素,可以提供一个高层的接口以允许访问者访问它的元素
public class ObjectStructure {
    private IElement elementA;

    private IElement elementB;

    public ObjectStructure(IElement elementA, IElement elementB) {
        this.elementA = elementA;
        this.elementB = elementB;
    }

    public IElement getElementA() {
        return this.elementA;
    }

    public IElement getElementB() {
        return this.elementB;
    }
}

// 6、客户端
public class VisitorClient {
    public void test() {
        // (1) 创建元素实例
        IElement elementA = new ConcreteElementA();
        IElement elementB = new ConcreteElementB();
        // (2) 创建对象结构实例
        ObjectStructure objectStructure = new ObjectStructure(elementA, elementB);
        // (3) 创建具体访问者实例
        IVisitor visitorA = new ConcreteVisitorA();
        // (4) 调用访问者方法
        visitorA.visitElement((ConcreteElementA) objectStructure.getElementA());
        visitorA.visitElement((ConcreteElementB) objectStructure.getElementB());

        IVisitor visitorB = new ConcreteVisitorB();
        visitorB.visitElement((ConcreteElementA) objectStructure.getElementA());
        visitorB.visitElement((ConcreteElementB) objectStructure.getElementB());
    }
}

适用场景

在以下情况下可以考虑使用访问者模式:
(1) 如果需要对一个复杂对象结构中的所有元素执行某些操作,可考虑使用访问者模式。访问者模式通过在访问者对象中为多个目标类提供相同操作的变体,
让开发者能在属于不同类的一组对象上执行同一操作。
(2) 可使用访问者模式来清理辅助行为的业务逻辑。访问者模式可将所有非主要的行为抽取到一组访问者类中,使得程序的主要类能更专注于主要的工作。
(3) 当某个行为仅在类层次结构中的一些类中有意义,而在其他类中没有意义时,可考虑使用访问者模式。可将该行为抽取到单独的访问者类中,
只需实现接收相关类的对象作为参数的访问者方法并将其他方法留空即可。

优缺点

访问者模式有以下优点:
(1) 符合开闭原则。以引入在不同类对象上执行的新行为, 且无需对这些类做出修改。
(2) 符合单一职责原则。可将同一行为的不同版本移到同一个类中。
但是该模式也存在以下缺点:
(1) 代码可能会变得更加复杂。使用访问者模式可能会导致某些系统有过多的具体访问者类。
(2) 每次在元素层次结构中添加或移除一个类时,都要更新所有的访问者,所以该模式对于频繁调整对象结构的类并不友好。
(3) 在访问者同某个元素进行交互时,可能没有访问元素私有成员变量和方法的必要权限。这与迪米特法则相违背。
(4) 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素。

参考

《设计模式 可复用面向对象软件的基础》 Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides 著, 李英军, 马晓星等译
https://refactoringguru.cn/design-patterns/visitor 访问者模式
https://www.runoob.com/design-pattern/visitor-pattern.html 访问者模式
https://www.cnblogs.com/adamjwh/p/10968634.html 简说设计模式——访问者模式文章来源地址https://www.toymoban.com/news/detail-635138.html

到了这里,关于访问者模式(Visitor)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kotlin~Visitor访问者模式

    概念 将数据结构和操作分离,使操作集合可以独立于数据结构变化。 角色介绍 Visitor:抽象访问者,为对象结构每个具体元素类声明一个访问操作。 Element:抽象元素,定义一个accept方法 ConcreteElement:具体元素,实现抽象元素的accept方法,在accept方法中调用访问者的访问方法

    2024年02月13日
    浏览(29)
  • PHP访问者模式(Visitor Pattern)

    访问者模式是一种行为设计模式,它允许你将算法与对象结构分离。当使用该模式时,你可以在不修改对象结构的前提下定义新的操作并应用于该对象结构中的所有元素。 在 PHP 中,访问者模式由两个主要部分组成: 访问者(Visitor) :定义了对对象结构中每个元素所执行的

    2023年04月08日
    浏览(29)
  • 设计模式之-访问者模式,快速掌握访问者模式,通俗易懂的讲解访问者模式以及它的使用场景

    当谈到访问者模式时,我们可以通过以下方式进行详细解释: 访问者模式是一种行为型设计模式,它允许你在不修改已有代码的情况下,向现有对象结构添加新的操作。该模式将操作(或方法)封装在称为访问者的独立对象中,使得可以在不修改元素类的情况下,通过访问者

    2024年02月03日
    浏览(59)
  • 设计模式—访问者模式

     需求:店铺采购了一批水果(苹果及橘子),现在市场监督局来店里检查过期的水果。 如果此时再添加一个操作:找出新品上市的水果。 上述代码中,FruitMarket为应付新增操作,增加了相应的方法来满足要求,但这样破坏了FruitMarket的结构。 本质是将数据结构和数据操作分

    2024年02月10日
    浏览(60)
  • 设计模式——访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它主要用于在不修改现有类结构的前提下向对象结构添加新的操作。访问者模式通过定义一个访问者接口,使得可以在不改变元素类的情况下,为各个元素类增加新的功能。 元素接口(Element Interface): 定义了一个accept()方法

    2024年01月18日
    浏览(58)
  • 设计模式——19. 访问者模式

    访问者模式(Visitor Pattern)是一种行为型设计模式,它允许你在不改变元素类(被访问者)的前提下,定义对元素的新操作(访问者),并将这些操作封装到独立的访问者类中。这样,你可以在不修改被访问者的类的情况下,通过不同的访问者来执行不同的操作。 访问者模式

    2024年02月07日
    浏览(43)
  • 设计模式之访问者模式(上)

    访问者模式 1)概述 1.概念 访问者模式包含 访问者 和 被访问元素 两个主要组成部分。 处方单中的各种药品信息就是 被访问的元素 ,而划价人员和药房工作人员就是 访问者 ,被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。 被访问元素

    2024年04月25日
    浏览(41)
  • Java设计模式-访问者模式

    在软件开发领域中,设计模式是解决常见问题的经典方法。其中,访问者模式是一种强大且灵活的设计模式,用于处理对象结构中的元素,并根据不同的访问者实现不同的操作。 访问者模式是一种行为型设计模式,它允许你在不改变元素类的前提下定义新的操作。该模式将算

    2024年02月06日
    浏览(54)
  • js设计模式:访问者模式

    将操作方法封装在一个访问者对象中,而不是封装在每个被访问对象当中。 访问者对象可以通过调用被访问者的接口,用来操作被访问者。

    2024年02月22日
    浏览(72)
  • 设计模式之访问者模式(下)

    3)访问者模式与组合模式联用 1.概述 在访问者模式中,包含一个用于存储元素对象集合的对象结构,可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。 2.结构图

    2024年04月25日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包