概述

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。简单来说,访问者模式就是一种分离对象数据结构与行为的方法,通过这种分离,可达到为一个被访问者动态添加新的操作而无需做其它的修改的效果。

访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。其缺点就是增加新的数据结构很困难。—— From 百科

涉及角色

  • Visitor
    抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法的参数定义哪些对象是可以被访问的。
  • ConcreteVisitor
    具体访问者:它影响访问者访问到一个类后该怎么干,要做什么事情。
  • Element
    抽象元素:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。
  • ConcreteElement
    具体元素:实现accept方法,通常是visitor.visit(this),基本上都形成了一种模式了。
  • ObjectStruture
    结构对象:元素产生者,一般容纳在多个不同类、不同接口的容器,如List、Set、Map等,在项目中,一般很少抽象出这个角色。处理element角色的集合。

UML

使用场景

  • 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作,也就说是用迭代器模式已经不能胜任的情景。
  • 需要对一个对象结构中的对象进行很多不同并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。

优点

  • 好的扩展性
    能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
  • 好的复用性
    可以通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
  • 分离无关行为
    可以通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

缺点

  • 对象结构变化很困难
    不适用于对象结构中的类经常变化的情况,因为对象结构发生了改变,访问者的接口和访问者的实现都要发生相应的改变,代价太高。
  • 破坏封装
    访问者模式通常需要对象结构开放内部数据给访问者和ObjectStructrue,这破坏了对象的封装性。

代码示例

package com.designpattern.visitor;public abstract class Node {public abstract void accept(Visitor visitor);
}
package com.designpattern.visitor;public class NodeA extends Node{/*** 接受操作*/@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}/*** NodeA特有的方法*/public String operationA(){return "NodeA";}}
package com.designpattern.visitor;public class NodeB extends Node{/*** 接受操作*/@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}/*** NodeA特有的方法*/public String operationB(){return "NodeB";}}
package com.designpattern.visitor;public interface Visitor {public void visit(NodeA node);public void visit(NodeB node);
}
package com.designpattern.visitor;public class VisitorA implements Visitor {@Overridepublic void visit(NodeA node) {System.out.println("VisitorA:"+node.operationA());}/*** 对应于NodeB的访问操作*/@Overridepublic void visit(NodeB node) {System.out.println("VisitorA:"+node.operationB());}
}
package com.designpattern.visitor;public class VisitorB implements Visitor {@Overridepublic void visit(NodeA node) {System.out.println("VisitorB:"+node.operationA());}/*** 对应于NodeB的访问操作*/@Overridepublic void visit(NodeB node) {System.out.println("VisitorB:"+node.operationB());}
}
package com.designpattern.visitor;import java.util.ArrayList;
import java.util.List;public class ObjectStructure {private List<Node> nodes = new ArrayList<Node>();/*** 执行方法操作*/public void action(Visitor visitor) {for (Node node : nodes) {node.accept(visitor);}}/*** 添加一个新元素*/public void add(Node node) {nodes.add(node);}
}
package com.designpattern.visitor;public class TestMain {public static void main(String[] args) {// 创建一个结构对象ObjectStructure os = new ObjectStructure();// 给结构增加一个节点os.add(new NodeA());// 给结构增加一个节点os.add(new NodeB());// 创建一个访问者Visitor visitor = new VisitorA();os.action(visitor);}
}

设计模式----访问者模式相关推荐

  1. 设计模式 访问者模式

    文章目录 访问者模式 访问者模式实战 访问者模式 在相同的数据结构下, 增加容易变化的业务访问逻辑, 为了增强扩展性, 将易变的访问逻辑进行解耦的一种设计模式. 访问者模式实战 模拟学校中, 有老师和 ...

  2. 设计模式---访问者模式

    访问者模式 介绍 定义及使用场景 UML类图 角色 财务案例 个人心得体会 静态分派以及动态分派 静态分派 动态分派 访问者模式中的伪动态双分派 对访问者模式的一些思考 总结 优点 缺点 适用性 参考 ...

  3. C++设计模式——访问者模式(visitor pattern)

    一.原理讲解 1.1意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 1.2应用场景 一个对象结构包含很多类对象,它们有不同的接口,而你 ...

  4. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  5. yii2通过url访问类中的方法_行为型设计模式 访问者模式

    author zong email zongzhe1996@163.com 介绍 在访问者模式中,通过使用一个访问者类,可以改变元素类(被访问者)的执行算法.元素类的执行算法可以随着访问者的改变而改变 ...

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

    目录 基本概念 代码与实例 基本概念 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作. UML图如下(此图来源于大 ...

  7. PHP设计模式——访问者模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 访问者模式表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: 角色 ...

  8. C#设计模式——访问者模式(Vistor Pattern)

    一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...

  9. 大话设计模式—访问者模式

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...

  10. C++设计模式——访问者模式

    访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...

最新文章

  1. article.app.php,【求助】修改app\portal\AdminArticle.php二次开发提交数据出错的疑问
  2. print格式化输出,以及使用format控制
  3. Java 8 集合不完全一览
  4. 字王谈M1字形与个人云字库
  5. 什么是 SAP vocabulary-based annotations
  6. 一个有趣的问题,讨论讨论
  7. 2016-12-17 新浪博客服务器挂掉了,所有博客页面都无法打开
  8. python把英语句子成分字母_句子成分的表达字母
  9. [vue] vue组件之间的通信都有哪些?
  10. gpedit msc组策略面板 win10在哪里_Win10家庭版找不到本地组策略gpedit.msc解决办法...
  11. c# 模拟登陆 webbrowser 抓取_《VR+电力——更换绝缘子培训》已登陆Pico Neo 2
  12. Apache Solr 未授权上传(RCE)漏洞(CVE-2020-13957)的原理分析与验证
  13. 【小白】线性表的链式存储结构的实现(C语言版)
  14. 云呐|国有企业资产管理系统建设该如何开展_固定资产管理信息系统
  15. python爬取虎扑评论_python-2:爬取某个网页(虎扑)帖子的标题做词云图
  16. js 入门基础(一)
  17. 牛客每日练习----分元宵,送分啦-QAQ,字符串的问题
  18. 5款优秀的在线表格生成工具
  19. java AES文件流加密
  20. 大型项目前端架构浅谈(8000字原创首发)

热门文章

  1. 小组面试(群P)经历
  2. Springer英文文献下载不了的文章,从哪里找,【建议收藏】,英文文献技巧分享
  3. 快递江湖:一支穿云箭 千军万马来相见
  4. 刷爆力扣之电话号码的字母组合
  5. 3d 视频切换到全屏播放
  6. 联想微型计算机M3500q怎么拆,爆发小宇宙 创新与实用完美结合联想M3500q
  7. linux自学笔记(2)
  8. 【Linux】关于三角函数、反三角函数在VC和linux gcc下的编译
  9. 新员工培训的13条黄金法则
  10. 老年产品的工业设计有多重要?