区块链技术博客
www.b2bchain.cn

访问者设计模式

这篇文章主要介绍了访问者设计模式的讲解,通过具体代码实例进行16238 讲解,并且分析了访问者设计模式的详细步骤与相关技巧,需要的朋友可以参考下https://www.b2bchain.cn/?p=16238

本文实例讲述了2、树莓派设置连接WiFi,开启VNC等等的讲解。分享给大家供大家参考文章查询地址https://www.b2bchain.cn/7039.html。具体如下:

访问者设计模式

兄弟们好,今天我们来聊一下访问者设计模式

说实话,这个设计模式花费了我挺长时间的,比较晦涩难懂。同时这个设计模式在我们的业务中应用场景也不是很多,不过呢,这么贴心的我,当然要尽可能的用大白话去给兄弟们好好的聊聊这个设计模式。

我们先从名字上聊聊:访问者设计模式,有一个访问者,所以呢,它应该是用来放问对象的,访问对象最常见的方式就是我们的get/set方法了,另外呢,对于多个对象,例如数组,集合等等,访问方式可以存在一个遍历,不过这种方式,往往会有一个问题,就是**不同的访问者可能想要对这个对象做不同的事情。**就比如对于一个漂亮的小姐姐,我和屏幕前的行为肯定可能不一样,屏幕前的你会绅士的过去搭讪,要微信等等,而我这个lsp,估计就看看就走了(官方认证,哈哈哈)。所以呢,我们需要这个对象给不同的人提供不同的应对方式

这个时候,可能有的兄弟想起了一个设计模式**,没错,就是迭代器设计模式**,这个设计模式就是用来对不同的集合容器进行遍历的,我们可以通过定义不同的迭代器来实现对对象的访问。不过它的作用有限,它不能对对象的行为进行修改,它仅仅可以拿到这个对象原本的处理方式。

这个时候,有兄弟又说了,可以修改对象的行为,这不是代理模式或者装饰者设计模式嘛?不过通过这两模式的确可以实现我们的需求,不过还又另一种设计模式,就是我们今天的访问者设计模式,它提供了另外一种实现这种需求的方式。

访问者设计模式的思想:所有可以被访问的对象,都会声明一个accept方法,用来定义哪些访问者可以访问这个对象 ,所有的访问者对象都自己实现一套访问这些对象的方法。当访问者进行访问的时候,调用器调用accept方法,这个时候会通过遍历的方式,调用每一个可以被访问对象的accept方法,进而调用访问者对象定义的对这个对象的访问方法。

一个伪图,更加便于大家理解:

访问者设计模式

我们再来看一下它的具体类图实现:

访问者设计模式

角色划分:

  • 抽象访问者。定义了关于所以可以被访问的功能方法。(Visitor)
  • 具体的访问者。定义了该访问者访问这些被访问对象的特定方式。(Convistor
  • 元素对象。定义了可以访问对象的accept方法。Element
  • 具体被访问者。实现了元素对象,重写了accept方法,实现元素对象。Small,Big
  • 控制器。用来控制增加或者删除可以被访问对象和具体的访问者访问被访问者,实现元素对象。(ElementController)

具体代码实现:

抽象访问者:

abstract class Vistor{     abstract void vistorTom(Tom tom);     abstract void vistorJack(Jack jack); }

具体的访问者:

class StuVistor extends Vistor{     @Override     void vistorTom(Tom tom) {         tom.name="stu1" ;         System.out.println("这是学生访问者"+tom.name);     }      @Override     void vistorJack(Jack jack) {         jack.name="jack1";         System.out.println("这是Jack访问者"+jack.name);     } }

元素对象:

interface Element{     void accept(Vistor vistor); } 

被访问者:

class Tom implements Element{     String name ;     String age ;      @Override     public void accept(Vistor vistor) {         vistor.vistorTom(this);     } } class Jack implements Element{     String name ;     String age ;      @Override     public void accept(Vistor vistor) {         vistor.vistorJack(this);     } }

控制器:

class ConElement implements Element{      private List<Element> lists = new LinkedList<>();      @Override     public void accept(Vistor vistor) {         for (int i = 0; i < lists.size(); i++) {             lists.get(i).accept(vistor);         }     }      public ConElement addVistor(Element element){         lists.add(element);         return this ;     } }

客户端:

public class VisitorDesgin {       public static void main(String[] args) {         Element element = new ConElement().addVistor(new Jack()).addVistor(new Tom());          StuVistor stuVistor = new StuVistor();         element.accept(stuVistor);     } }

好啦,今天的设计模式就到这里了。我们明天再见。兄弟们,晚安呀。

本文转自互联网,侵权联系删除访问者设计模式

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 访问者设计模式
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们