`

设计模式之访问者模式Visitor

 
阅读更多

访问者模式

 

 

实现思路:向对象结构类中添加元素,然后定义多种访问者,使用对象结构类去接受访问者即可。

 

六个角色

  • 抽象访问者(Visitor):抽象出访问元素的动作,该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过元素角色给具体访问的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它
  • 具体访问者(ConcreteVisitor):实现访问元素的动作,实现每个由访问者Visitor声明的操作
  • 抽象元素(Element):定义一个接受访问的操作(Accept操作),其参数为访问者
  • 具体元素(ConcreteElement):实现抽象元素角色提供的Accept操作
  •  对象结构类(ObjectStructure):可以枚举元素,并且管理元素,这是使用访问者模式必备的角色,它要具备以下特征,能枚举它的元素,可以提供一个高层的接口以允许该访问者访问它的元素,可以是一个复合(组合模式)或是一个集合。如一个列表或一个无序集合。
  • 客户端(Client) :定义元素集合,然后接受不同访问者的访问
 

结构图:

 


 撇开现象看本质

 Visitor.visit(Element element){}

Element.accept(Visitor visitor){

            visitor.visit();

           }

看到这 visitor 和 accept 方法我们立刻明白了,原来是重点是回调函数

 

应用场景:用户去访问博客

 

分析:用户可以通过电脑上的Web方式(访问者)或者手机Wap方式(访问者)或者Pad平板(访问者)的方式去访问博客,每篇博客是一个元素(有A博客,B博客,C博客),然后博客列表是一个对象结构类。下面我们在控制台程序去演示一下如何使用Visitor Pattern:

 

public interface Visitor {
    public void visit(Element element);
}

// 网页版访问
class WebVisitor implements Visitor {
    @Override
    public void visit(Element element) {
        System.out.println("Web用户浏览blog");
    }
}

 // 手机版访问
class PhoneVisitor implements Visitor {
    @Override
    public void visit(Element element) {
        System.out.println("手机用户访问blog");
    }
}

//平板访问
class PadVisitor implements Visitor {
    @Override
    public void visit(Element element) {
        System.out.println("平板用户访问blog");
    }
}

 文章Blog类

 

public abstract class Element {

    private String name ;

    public Element(String name) {
        this.name = name;
    }

    abstract public void accept(Visitor visitor);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

class BlogElementA extends Element {

    public BlogElementA(String name) {
        super(name);
    }
    @Override
    public void accept(Visitor visitor) {
        System.out.println(this.getName()+"_A被访问");
        visitor.visit(this);
    }

}

class BlogElementB extends Element{

    public BlogElementB(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        System.out.println(this.getName()+"_B被访问");
        visitor.visit(this);
    }
}

class BlogElementC extends Element{

    public BlogElementC(String name) {
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
        System.out.println(this.getName()+"_C被访问");
        visitor.visit(this);
    }
}
  

 

Context 环境角色 对象结构类(ObjectStructure)

public class Context {

    private List<Element> blogList = new ArrayList<>();

    public void add(Element element)
    {
        blogList.add(element);
    }

    public void remove(Element element)
    {
        blogList.remove(element);
    }

    public void accept(Visitor visitor)
    {
        for(Element element:blogList){
            element.accept(visitor);
        }
    }
}

public class Client {
    private static Context ctx = new Context();
    public static void main(String[] args) {
        ctx.add(new BlogElementA("我的家乡(抒情散文)"));
        ctx.add(new BlogElementB("访问者模式(技术指导)"));
        ctx.add(new BlogElementC("旅行指导(建议)"));
        ctx.accept(new WebVisitor());
        ctx.accept(new PadVisitor());
        ctx.accept(new PhoneVisitor());
    }
}

 运行结果

我的家乡(抒情散文)_A被访问:来自Web用户浏览blog
访问者模式(技术指导)_B被访问:来自Web用户浏览blog
旅行指导(建议)_C被访问:来自Web用户浏览blog

我的家乡(抒情散文)_A被访问:来自平板用户访问blog
访问者模式(技术指导)_B被访问:来自平板用户访问blog
旅行指导(建议)_C被访问:来自平板用户访问blog

我的家乡(抒情散文)_A被访问:来自手机用户访问blog
访问者模式(技术指导)_B被访问:来自手机用户访问blog
旅行指导(建议)_C被访问:来自手机用户访问blog

 

对于某个对象或者一组对象,不同的访问者,产生的结果不同,执行操作也不同。此时,就是访问者模式的典型应用了。

  应用场景

  1 不同的子类,依赖于不同的其他对象

  2 需要对一组对象,进行许多不相关的操作,又不想在类中是现在这些方法

  3 定义的类很少改变,但是执行的操作却经常发生改变。

  • 大小: 32.9 KB
分享到:
评论

相关推荐

    设计模式C++学习之访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式将算法与数据结构分离,使得算法可以独立于数据结构进行变化,增强了系统的可扩展性。 在C++中...

    设计模式之访问者模式(Visitor)

    访问者模式是一种行为设计模式,它使你可以在不修改对象结构的情况下,为对象添加新的操作。这种模式的核心在于将数据结构与对这些数据的操作解耦,使得增加新的操作变得容易,同时也允许独立地改变元素类和访问者类...

    设计模式之访问者模式(Visitor Pattern)

    **访问者模式(Visitor Pattern)**是一种行为设计模式,它提供了一种在不修改对象结构的情况下增加新操作的方法。这种模式的主要思想是将数据结构与算法分离,使得算法可以在不改变对象结构的情况下独立变化。 在...

    设计模式系列之visitor

    "设计模式系列之visitor"是一个关于软件设计模式的讨论,特别是关注于“访问者”(Visitor)模式。这个模式是GOF(Gamma, Helm, Johnson, Vlissides)在他们的经典著作《设计模式:可复用面向对象软件的基础》中提出...

    设计模式之访问者模式

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响这些元素自身的行为。这种模式的主要目的是将数据操作和业务逻辑分离,使得数据结构...

    C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式

    ### C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式 #### 概述 在本篇文章中,我们将深入探讨面向对象设计模式中的一个非常重要的模式——**Visitor(访问者)模式**。此模式属于行为型模式的一...

    设计模式-访问者模式(Visitor)

    访问者模式(Visitor)是一种行为设计模式,它允许在不修改对象结构的前提下向对象结构中的元素添加新的操作。这种模式的核心思想是分离了算法和对象结构,使得算法可以在不改变对象结构的情况下独立变化。 访问者...

    基于visitor模式和访问者模式的表达式树_求值引擎

    2. **访问者模式**:这是与Visitor模式相关的另一种设计模式,但在这里,我们可能是指在表达式树的节点上应用访问者模式。访问者模式使得可以在不修改节点类的情况下,增加对节点的新功能。在本项目中,可能是通过在...

    设计模式之访问者模式Java版本实现

    **访问者模式**是软件设计模式中的一种结构型模式,它允许在不修改对象结构的情况下,在对象上增加新的操作。这种模式将数据结构与数据操作分离,使得代码更易于维护和扩展。 在Java中实现访问者模式,通常包括以下...

    设计模式-访问者(Visitor)模式详解和应用.pdf

    ### 设计模式-访问者(Visitor)模式详解和应用 #### 一、访问者模式简介 访问者模式(Visitor Pattern)是一种行为型设计模式,它允许我们向一组已存在的类添加新的行为,而无需修改这些类。这种模式的核心思想是在...

    java设计模式之访问者模式

    访问者模式是一种软件设计模式,它允许在不改变对象结构的情况下,在对象的现有结构上增加新的操作。在Java中,这种模式尤其有用,因为它能够帮助我们保持类的封装性,同时提供了一种灵活的方式来扩展对象的功能。...

    访问者模式VisitorPattern

    访问者模式是一种行为设计模式,它使你能在不修改对象结构的前提下向对象添加新的操作。这种模式常用于处理具有复杂逻辑的对象结构,特别是当你需要对这些对象进行多态操作时。访问者模式将算法与数据结构分离,使得...

    设计模式的访问者模式的例子

    访问者模式是一种软件设计模式,它在对象结构中定义了一个访问者的接口,使得该访问者可以访问该结构中的每一个元素,同时不影响对象结构本身。这种模式的主要目的是将数据操作与数据结构分离,使得数据结构的变化...

    (行为型模式) Visitor 访问者模式

    C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载

    设计模式-访问者模式(讲解及其实现代码)

    访问者模式是一种行为设计模式,它允许在不修改对象结构的情况下向对象添加新的操作。这种模式的核心思想是将数据结构与算法分离,使得算法可以在不改变对象结构的前提下增加对对象的操作。 在软件开发中,有时我们...

    设计模式 - 访问者模式

    访问者模式(Visitor Pattern)是一种行为设计模式,它使你能在不修改对象结构的前提下向其添加新的操作。这种模式常用于处理具有相同接口或抽象类的对象结构,使得可以在不改变原有结构的基础上增加功能,实现对...

    设计模式 访问者模式

    **访问者模式**是一种行为设计模式,它允许在不修改对象结构的情况下添加新的操作。这种模式主要用于处理具有复杂对象结构的情况,使得我们可以对结构中的每个元素执行特定操作,而无需暴露其内部实现。 访问者模式...

    C#设计模式之Visitor

    **C#设计模式之Visitor** **一、设计模式概述** 设计模式是软件开发中的经验总结,它提供了解决常见问题的可复用解决方案。在C#编程中,设计模式可以帮助我们编写更灵活、可扩展和易于维护的代码。"Visitor"(访问...

Global site tag (gtag.js) - Google Analytics