访问者模式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. C的指针疑惑:C和指针17(经典抽象数据类型)

    堆栈这种数据最鲜明的特点是:后进先出. 用动态数组实现堆栈: #include "C17.h" #include <stdio.h> #include <stdl ...

  2. 《Oracle RAC性能优化》

    一 RAC环境 RAC架构,2节点信息 节点1 SQL> show parameter instance NAME                                 TYPE    ...

  3. IDEA 程序直接运行分析

    今天用IDEA运行SpringBoot程序,启动时始终报错说读取不到datasource的url配置. 分析代码的resources目录,是有配置文件的,配置也是正常的.如下图: 后来经人指点,是因为 ...

  4. mongodb中的_id的ObjectId的生成规则

    MongoDB中存储的文档必须有一个"_id" .这个键值可以是任何类型,默认是ObjectID对象.在一个集合里,每个文档都有一个唯一的“_id”,确保集合里的每个文档都能被唯一 ...

  5. python3.6 pyinstaller 打包exe

    现在的pyinstaller 最新版本已经支持python3.6版本的打包了只需要进行如下的操作即可 1. pip install pyinstaller 2. pip install --upgra ...

  6. Ubuntu 16.04 安装Navicat Premium

    一.介绍 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库 ...

  7. mysql中sql语句中常见的group_concat()函数意思以及用法,oracle中与其一样的功能函数是wmsys.wm_concat()

    1.group_concat(),手册上说明:该函数返回带有来自一个组的连接的非NULL值的字符串结果.比较抽象,难以理解. 通俗点理解,其实是这样的:group_concat()会计算哪些行属于同一 ...

  8. 【转】安装Vue.js的方法

    安装vue.js的方法   一.简介 Vue.js 是什么 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量 ...

  9. C++开学第二次作业(5.14)

    开学第二次作业(5.14) 代码传送门 题目 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为 ...

  10. Flask-最简单的Python http服务框架使用

    环境准备 Python + pip + Flask sudo easy_install pip sudo pip install flask 代码如下(做了个jieba分词的服务) # encodin ...