访问者模式C++实现

1定义Visitor Pattern

封装一些作用于某种数据结构中各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素新的操作

2类图

角色分析

Visitor抽象访问者,声明可以访问哪些元素,具体到程序中就是Visit方法参数定义哪些对象可以被访问

ConcreteVisitor,他影响访问者访问到一个类之后该怎么做

Element抽象元素,声明哪一个类访问者访问,程序上通过accept方法中的参数定义

ConcreteElement实现accept方法,visitor.visit(this)基本形成一种模式

ObjectStrture结构对象,元素产生者,一般容纳多个不同类,不同接口的容器,如list,set,map,在项目中一般很少抽象这个角色

3实现

class Element

{

protected:

  Element();

public:

  void doSomething();

  void accept(Ivisitor visitor) = 0;

  virtual ~Element() = 0;

};

class ConcreteElement

{

public:

  void doSomething();

  void accept(IVisitor visitor)

  {

    visitor.visit(*this);

  }

};

class IVisitor

{

public:

  void Visitor(ConcreteElent el);

};

class Visitor:public IVisitor

{

public:

  void visit(Concrete el)

  {

    el.doSomething();

  }

};

//结构体对象

class ObjectStuture

{

public:

  static Element createElement()

  {

    Random rand = new Random();

    return new ConcreteElement();

  }

};

4应用

①优点

单一职责,Elementz子类加载数据,Visitor负责报表展示

优秀的扩展性,增加数据操作是很方便的

灵活性高,可以实现Element提供数据,Visitor对数据进行修饰并呈现

②缺点

具体元素对访问者公布细节

具体元素变更困难,因为要同时变更Visitor

违背依赖倒置原则,访问者依赖具体元素而不是抽象元素

③使用场景

一个对象结构包含很多类对象,他们接口不同,而你需要对其是实施的具体操作依赖具体类.迭代器模式不能胜任

需要对一个结构体中的对象进行很多不同且不相关的操作,且不想操作 污染对象的类。

::业务规则要求遍历多个不同的对象,与迭代器模式对比。

同时访问者模式也可以充当拦截器角色,在混编模式中

5扩展

①统计功能

将数据统计和批处理通过访问者模式进行处理

②多个访问者

设计模式--访问者模式C++实现的更多相关文章

  1. .NET设计模式访问者模式

    一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...

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

    一. 访问者(Vistor)模式 访问者模式是封装一些施加于某种数据结构之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保存不变.访问者模式适用于数据结构相对稳定的系统, 它把数据结 ...

  3. JAVA 设计模式 访问者模式

    用途 访问者模式 (Visitor) 表示一个作用于某对象结构中的各元素的操作. 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 访问者模式是一种行为型模式. 用途

  4. 深入浅出设计模式——访问者模式(Visitor Pattern)

    模式动机 对于系统中的某些对象,它们存储在同一个集合中,且具有不同的类型,而且对于该集合中的对象,可以接受一类称为访问者的对象来访问,而且不同的访问者其访问方式有所不同,访问者模式为解决这类问题而诞生 ...

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

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

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

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

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

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...

  8. Java设计模式—访问者模式

    原文地址:http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html 总结的太棒啦,导致自己看了都不想总结了...... 在 ...

  9. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  10. Java设计模式-访问者模式(Visitor)

    访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系统.因为访问者模式使得算法操作增加变得容易.若系统数据结构对象易于变化,经 ...

随机推荐

  1. python2和python3中range的区别

    参考自 python2和python3中的range区别 - CSDN博客 http://blog.csdn.net/xiexingshishu/article/details/48581379 py ...

  2. RF是如何工作的?

    随机森林的发展史 谈及随机森林算法的产生与发展,我们必须回溯到20世纪80年代.可以说,该算法是Leo Breiman, Adele Cutler, Ho Tin Kam, Dietterich, A ...

  3. javascript笔记——js获取input标签中光标的索引

    出处:http://www.cnblogs.com/MrZouJian/p/5850553.html function getTxt1CursorPosition(){ var oTxt1 = doc ...

  4. python全栈开发从入门到放弃之模块和包

    一 模块 1 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编 ...

  5. sqlserver 2005/2008 导入超大sql文件

    SQLCMD -E -dmaster -ic:\Scripts\create_db.sql 安装了Microsoft® SQL Server® 2008 R2 Native Client可用

  6. Protobuf 数据类型

    .proto Type   Notes C++ Type Java Type double    double  double float    float  float int32 Uses var ...

  7. usermod命令、用户密码管理、mkpasswd命令

    3.4 usermod命令--更改用户帐户属性 -a|--append ##把用户追加到某些组中,仅与-G选项一起使用 -G|--groups ##把用户追加到某些组中,仅与-a选项一起使用:把该用户 ...

  8. TOSCA自动化测试工具安装

    1.下载链接 https://www.tricentis.com/software-testing-tools/ 2.免费试用14天, 弹出的页面输入邮箱地址--> 输入一堆信息-->点击 ...

  9. 20145316许心远《Java学习笔记》第三周总结

    20145316许心远<Java程序设计>第3周学习总结 教材学习内容总结 一.定义类: 类定义时使用class关键字 如果要将x绑定到新建的对象上,可以使用"="制定 ...

  10. logstash编写2以及结合kibana使用

    有时候根据日志的内容,可能一行不能全部显示,会延续在下一行,为了将上下内容关联在一起,于是codec插件中的multiline插件 就派上用场了,源日志内容: [2017-09-20T16:04:34 ...