Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >在旅行中带你探索访问者模式

在旅行中带你探索访问者模式

作者头像
用户1260737
发布于 2019-08-19 07:46:11
发布于 2019-08-19 07:46:11
68400
代码可运行
举报
文章被收录于专栏:趣谈编程趣谈编程
运行总次数:0
代码可运行
来源:编程新说

作者:李新杰

老实说,在实际编程中,访问者设计模式应用的并不多,至少我是这样认为的,因为它的主要使用场景并不多。 那么肯定会有人问,访问者模式的主要使用场景是什么呢?继续往下看便知。 新闻联播看多了之后 首先要说的是,设计模式中的“访问者”和现实生活中的“访问者”其本质是一回事。虽然设计模式中的不太熟悉,但现实生活中的再熟悉不过了。 我在以前的文章中多次提到过,有时站在现实生活的角度看待某些技术点反而会更容易看清楚,那照例还是从生活中的事情说起吧。 说起访问者,我能够想到最高大上的,莫过于国家领导人的国事访问。以中方访问美方来说吧,这里面的大致内容(我猜)应该是这样的: 中方专机什么时间在哪个机场降落,美方派谁在机场迎接,然后就是欢迎仪式和欢迎晚宴,接着就是会见哪些人,开哪些会议,签署哪些文件,参观哪些地方等等,最后就是结束访问启程回国。 当然这些内容肯定是双方外交部门都提前沟通好的。但是仍然是在美方的安排下一步一步进行,因为我们是作为访客的身份,人家是东道主,要尽地主之谊的。(虽然老美不是什么好东西) 比如人家安排的吃牛排,那我们就吃吧。我们总不能要求他们改成“主席套餐”吧,再说他们的厨师也搞定啊。 等到老美的总统来我们国家访问的时候,他们就成了访客了,我们就是东道主,整体就得由我们来安排。让他喝稀饭他就不能吃大米,不喜欢吃就晚上自己回酒店泡方便面,哈哈哈哈。 如果把这个事情抽象一下就是,一方在另一方的安排下,逐步有序的做一些事情。 自己想体验的话就来个这吧 国事访问这事啊离我们太遥远了,那就再看个和我们息息相关的吧。没错,就是旅游。无论是国内游还是出境游,其实差别不大,大致内容应该是这样的: 先报好旅行社,在指定的时间乘坐交通工具到达目的地后,会有一辆大巴车拉着我们,按照行程开始去景点,去吃饭,去酒店等等。 我们什么都不用操心,跟着走就行了,因为旅行社和导游都安排好了。再说了,即我们使有意见,导游也不会听我们的。 颇令人讨厌的可能就是逛购物店了,但是没办法,因为协议已经签了。我们有义务进购物店,听相关人员讲解,想买的就买,不想买的随便看看,但是不能提前出去。 其实还有更坑的,那就是导游在大巴车上强行收费,说些很难听的话,甚至骂人/威胁。尤其是在境外,他们觉得此生很难再见面,有时话说的特别难听。 所以整个行程下来,既有高兴的时候,也有心烦的时候。导游给我们讲解当地历史的时候,觉得他是“好人”,领我们进购物店时,又觉得他是“坏人”。 其实都不是,他是“工人”,一个从事旅游行业工作的人。一个需要养家糊口的人,跟我们没啥区别。我是不是很善解人意啊。 如果把这个事情也抽象一下就是,必须按照既定的规则走完所有事项,如果对某个事项关心,那就积极的去获取自己想要的信息,如果对某个事项不关心,那就默默的跟随即可,什么都不用做,但是不准离开。 做一个善于思考总结的人 我想说的是既然报团游有如此多的问题,为什么还有那么多人报团,而不选自由行呢。答案是显而易见的。 以出境游来说,当你达到国外,人生地不熟,语言又不通,很多事情的推进会特别艰难。 当然也可以提前研究攻略,制定好路线,订好酒店机票等。但是旅游主要是想放松一下,为了出国一周,在家看三个月攻略,岂不是更累吗? 总结一下,当你对所要做的事情完全不了解,而且想要了解的话需花费很大的精力时,只能选择第三方给出的方案,虽然明知里面可能会有坑。 对于像国事访问的,因为有许多礼仪礼节或规则约束需要遵守,所以一般也都听从东道主的安排。 虽然出访和旅游这两件事的本质完全不一样,但是他们的宏观进行模式却基本一致。 到此我们已经讲了两件事,两个特点,两个原因。请仔细体会下。看起来有点让人不爽,但又颇有些无奈。 这两件事都是站在“访问者”的立场来说的,下面从多角度来看下。 从一个具体的示例说起 假如小明在北京工作多年,对北京非常熟悉。他的朋友小白来找他玩,而且是第一次来北京,打算去一些有名的景点。 在这件事中,小明就是东道主,小白就是访客。其实就是一方带另一方参观嘛。 站在东道主的角度,他要安排访客参观景点,所以是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * <p>东道主
 */
public interface Host {

    //带朋友去故宫
    void show(PalaceMuseum PalaceMuseum, Guest guest);

    //带朋友去长城
    void show(GreatWall GreatWall, Guest guest);

    //带朋友去颐和园
    void show(SummerPalace SummerPalace, Guest guest);
}

站在访客的角度,他是要参观景点的,所以是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * <p>客人
 */
public interface Guest {

    //看故宫
    void look(PalaceMuseum PalaceMuseum);

    //看长城
    void look(GreatWall GreatWall);

    //看颐和园
    void look(SummerPalace SummerPalace);
}

站在景点的角度,它是要接受访客的参观的,所以是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * <p>故宫
 */
public interface PalaceMuseum {

    //让访客看
    void accept(Guest guest);
}

/**
 * <p>长城
 */
public interface GreatWall {

    //让访客看
    void accept(Guest guest);
}

/**
 * <p>颐和园
 */
public interface SummerPalace {

    //让访客看
    void accept(Guest guest);
}

在这个事件中共有三种角色,它们的职责、目的和作用都非常清晰: 小明:东道主,职责是负责协助 小白:访客,目的是欣赏景点的景色 景点:被欣赏者,作用是提供景色 这就是一个访问者的模型,我们把它抽象并一般化,发现这是一个固定的套路或模式,称之为访问者模式。 在访问者模式中,共有三方参与者,它们的分工非常明确: 一方:访问者,获取信息的人 二方:被访问者,提供信息的人 三方:协调者,安排一二双方进行交互的人 可以这样来理解三方的定位,一方是购买者(出钱),二方是提供者(出力),三方是协调者(和稀泥)。哈哈。 注意,这里的一方二方三方都是访问者模式内部的概念,它们是一家人或一个单位的。 换个角度来看就是,访问者在协调者制定的规则下完成对被访问者的访问,期间获取关心的信息,忽略不关心的信息。 把访问者模式放到一个宏观应用中,应该是这样的:

用户程序->|访问者->协调者->被访问者|->底层复杂数据

访问者模式的推导 对于设计模式,一定要活学活用,不能拘泥于GOF。一定要按自己的场景需求来用,不能死搬硬套。 在访问者模式中,通常把被访问者称为元素,访问者自然还是访问者,抽象一下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//元素
public interface Element<V extends Visitor> {

    //接受访问者
    void accept(V visitor);
}

//访问者
public interface Visitor<E extends Element> {

    //访问元素
    void visit(E element);
}

请注意这里的泛型。 然后再抽象一下协调者:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public interface ObjectStructure {

    //所有元素
    List<Element> getElements();

    //所有访问者
    List<Visitor> getVisitors();
}

协调者拥有所有的元素和所有的访问者,它可以自己来实现访问规则,使访问者完成对元素的访问。 注意,我的抽象和GOF的不完全一样,因为前面已经说了要活学活用嘛。 那究竟是一个访问者访问一个元素,还是一个访问者访问多个元素,仍然是没有标准答案,应该根据实际情况来定。 比如大公司,一岗(位)一(个)人,事情做得精细。小公司,多岗(位)一(个)人,办事效率高。各有千秋,适合的才是最好的。 下面给出一个访问者访问一个元素的情况。 访问者A访问元素A:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//元素A
public interface ElementA extends Element<VisitorA> {

    @Override
    void accept(VisitorA visitor);
}

//访问者A
public interface VisitorA extends Visitor<ElementA> {

    @Override
    void visit(ElementA element);
}

由于上面使用了泛型,这里的方法参数可以换为精确的类型。 访问者B访问元素B:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//元素B
public interface ElementB extends Element<VisitorB> {

    @Override
    void accept(VisitorB visitor);
}

//访问者B
public interface VisitorB extends Visitor<ElementB> {

    @Override
    void visit(ElementB element);
}

后续就按照这个模式去扩展即可。有新的数据需要访问时,就添加新的元素和新的访问者,同时还可能需要修改协调者。 作者想要说的话 我们经常听到说,要学习西方模式,XX模式,YY模式等,其实主要是学习人家的理念和思想,而不是照抄,因为照抄有水土不服的问题。 所以,每一个开发人员或设计人员都不应该直接照抄GOF的设计模式。特别是为了使用而使用,就更没意思了。 访问者模式的主要应用场景之一就是,底层数据过于复杂,是的,过于复杂,上层应用无法直接访问。 如Java的字节码文件,我们的应用程序根本就无法直接访问。 还有一种就是不想让别人随意访问,可以通过访问者模式去约束访问者访问的方式。 比如我在大四时就去参观过汽车制造车间,由专人领着我们按照路线行走,因为随意乱跑不安全嘛。 访问者模式的中心思想就是,协调者制定好合理的规则,访问者按照规则进行访问,从自己关心的被访者上获取需要的数据信息。 当然也可以采用被动式的,协调者按照一定规则,把被访问者的信息逐步推送给访问者,访问者根据自己的需要来选择保存或忽略。 最后,设计模式是一种理念,一种思想,需要去思考,去领悟。 程序代码: https://github.com/coding-new-talking/java-code-demo.git

(END)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 趣谈编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python设计模式(11):访问者模式
在软件设计中,经常会遇到对系统中一个已经完成设计与代码编写的类的层次结构进行功能修改或增加新功能的情况,这就需要对该层次结构的某些类进行修改。如果改动量较小尚可,但是往往这种变动会经常发生,且任何变动都可能导致整个类层次结构中的大多数类都随之进行修改。此时,最好考虑对这个层次类重构。即将介绍的访问者模式(Visitor Pattern)可以用来解决类似的问题。访问者模式在处理数据结构较稳定,但是作用于其上的操作需要经常变化的问题时是非常有效的。
不可言诉的深渊
2019/07/26
8080
简易理解设计模式之:访问者模式——员工考核例子
它的基本思想是:将数据操作与数据结构分离,将一些稳定的对象的类拥有一个accept方法用来接收访问者访问。
Twcat_tree
2022/11/29
3410
简易理解设计模式之:访问者模式——员工考核例子
访问者模式(Visitor)
假如你的团队开发了一款能够使用巨型图像中地理信息的应用程序。图像中的每个节点既能代表复杂实体(例如一座城市),也能代表更精细的对象(例如工业区和旅游景点等)。如果节点代表的真实对象之间存在公路,那么这些节点就会相互连接。在程序内部,每个节点的类型都由其所属的类来表示,每个特定的节点则是一个对象。
兜兜转转
2023/03/08
3570
访问者模式(Visitor)
23种设计模式之访问者模式(Visitor Pattern)
访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。
Java技术债务
2022/09/26
5010
23种设计模式之访问者模式(Visitor Pattern)
设计模式之访问者模式
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
beginor
2020/08/10
2590
设计模式之访问者模式
JAVA 设计模式 访问者模式
本文介绍了设计模式中的访问者模式,通过一个具体示例介绍了访问者模式的实现方式,并给出了代码示例。
静默虚空
2018/01/05
5680
JAVA 设计模式 访问者模式
重温设计模式 --- 访问者模式
访问者模式是一种行为型设计模式,它允许你在不修改对象结构的前提下定义作用于这些对象元素的新操作。它主要解决了在不修改已有类的前提下,对已有类中的对象进行新操作的问题。
Niuery Diary
2023/10/22
1600
重温设计模式 --- 访问者模式
访问者模式
访问者模式是一种将数据结构与数据操作分离的设计模式。它允许你定义新的操作,而无需改变所操作的元素类。该模式的核心思想是,通过一个访问者类,可以访问不同类的元素,而不用关心这些元素的具体类。
JusterZhu
2023/10/08
1420
访问者模式
Java设计模式之访问者模式
访问者模式(Visitor Pattern)是一种行为设计模式,用于在不修改对象结构的前提下,为对象结构中的每个元素提供多种访问方式。在Java中,访问者模式是一种常见且有用的模式,可以帮助我们在不改变对象结构的情况下,增加对对象结构的新操作。
刺槐儿
2024/02/06
5320
设计模式--访问者模式
访问者模式是一种行为型设计模式,它允许你将算法从其操作的对象结构中分离出来。在访问者模式中,你可以声明一个抽象的访问者类型,其定义了一组访问操作API。具体的访问者类实现了这些操作。它们可以访问对象结构中的不同元素,并可在其中存储状态。结构体系可以通过在元素类中声明抽象的访问者接口并使用接口进行多态性引用来支持访问者。
软件架构师Michael
2023/07/30
2420
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
特此说明:对访问者模式理解不是特别透彻,若有误,请指正,谢谢! 1.概述 在软件开发过程中,对于系统中的某些对象,它们存储在同一个集合collection中,且 具有不同的类型 ,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且 不同的访问者其访问方式有所不同 。 例子1:顾客在超市中将选择的商品,如苹果、图书等放在购物车中,然后到收银员处付款。在购物过程中,顾客需要对这些商品进行访问,以便确认这些商品的质量,之后收银员计算价格时也需要访问购物车内顾客所选择的商品。
黄规速
2022/04/14
2970
设计模式 ( 二十 ) 访问者模式Visitor(对象行为型)
设计模式之访问者模式(行为型)
访问者模式:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。所以访问者模式是一种对象行为型模式。
SmileNicky
2019/03/20
5490
【地铁上的设计模式】--行为型模式:访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,它能够将算法与数据结构分离,使得算法可以独立于数据结构进行变化。它在不改变数据结构的前提下,定义了作用于数据结构中各个元素的新操作,即“访问者”,使得新增操作更加简单。访问者模式中,数据结构和操作是分开的,因此当需要新增一种操作时,只需增加相应的访问者即可,无需修改数据结构的代码,从而降低了系统的耦合度。 在访问者模式中,数据结构中的每个元素都有一个accept方法,它接收一个访问者作为参数,从而实现访问者对该元素的操作。访问者模式的核心思想就是“双重分派”,即先根据被访问者的类型来选择合适的访问者,再根据访问者的类型来调用合适的访问方法。 优点: 1.访问者模式能够在不改变原有数据结构的前提下,增加新的操作。 2.访问者模式将数据结构与操作分离,增加新的操作时,不会影响其他的操作。 3.访问者模式符合开闭原则。
喵叔
2023/05/14
3000
访问者模式
访问者模式(Visitor Pattern)是一种行为型设计模式,用于将数据结构与其操作解耦。通过在不改变数据结构的前提下,增加新的操作,访问者模式提供了一种灵活的方式来实现功能扩展。
码事漫谈
2024/12/20
1020
访问者模式
【设计模式】详解访问者(Visitor)模式-读完这篇你就会了
动物园中有多个场馆,比如豹子馆,海豚馆,大象馆等等,有些场馆是需要特殊收费的,动物园针对不同类型的游客有不同的收费方式,比如学生半价。
行百里er
2020/12/02
3.4K0
【设计模式】详解访问者(Visitor)模式-读完这篇你就会了
设计之禅——访问者模式
访问者模式是遵循单一职责原则,将行为和属性分离的一种设计模式,它可以在不改变元素结构的前提下定义元素新的操作。类比到现实当中就像博物馆,它是固定不变的,其中有各种各样的展品,而我们就是访客,可以是参观、可以是打扫、也可以是管理。同样访客模式正是具有了这样一个特点。
夜勿语
2020/09/07
5120
设计模式学习笔记(二十一)访问者模式及其实现
访问者模式(Visitor Pattern)指将作用域某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作。借用《Java设计模式》中的例子说明:在医院医生开具药单后,划价人员拿到药单后会根据药单上的药品名称和数量计算总价,而药房工作人员则根据药品名称和数量准备药品。如下图所示:
归思君
2023/10/16
3000
设计模式学习笔记(二十一)访问者模式及其实现
访问者模式
概念 访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作
xiangzhihong
2018/02/06
8860
访问者模式
设计模式学习之访问者模式
访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是当你一旦需要使用它时,那你就是需要使用它了。
老马的编程之旅
2022/06/22
3080
设计模式学习之访问者模式
大白话聊访问者模式:从入门到实践
访问者模式,重点在于访问者二字。说到访问,我们脑海中必定会想起新闻访谈,两个人面对面坐在一起。从字面上的意思理解:其实就相当于被访问者(某个公众人物)把访问者(记者)当成了外人,不想你随便动。你想要什么,我弄好之后给你(调用你的方法)。
陈树义
2021/02/25
5340
大白话聊访问者模式:从入门到实践
相关推荐
Python设计模式(11):访问者模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验