文档章节

设计模式-行为-Visitor(访问者)模式

梦想游戏人
 梦想游戏人
发布于 2016/05/05 23:00
字数 370
阅读 108
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

问题:

    oop开发中经常遇到需求变更,设计好的一个系统原型,客户的新需求来了,我们不得不更改已有的饿设计,最常见的方案就是

添加新类 或 新方法 来实现需求,这样机会不停的打补丁,设计不可能封闭,

访问者模式就是把要变动的 ,更新的 封装到一个类中(访问操作),由待更改的类提供一个接受接口,在不改变数据结构的情况下

,添加新功能(不修改Element的条件下 添加新操作,可通过扩展子类)


这里涉及到一个Double Dispatch 问题

具体调用哪一个Accept 由2个决定因素

  1. Accept是多态操作,所以要具体的Element 子类

  2. 因为Accept 参数类型是Visitor 要实际ConcreateVisitor才能决定。

所以要派发2次,访问者模式就是Double Dispatch的一种实现

关于double dispatch 在    http://my.oschina.net/kkkkkkkkkkkkk/blog/671305   阐述


  1. Visitor 可以为每个Element写一个访问接口,也可以通过重载或 RTTI 来简化接口的设计


#include "PublicHeaders.h"

#pragma once
class Visitor;

 
class Element
{
public:
	void Print()
	{
		cout << " this is element" << __FUNCTION__ << endl;
	}
	/**
	* @brief the interface of visitor's visit
	*/
	virtual void Accept(Visitor *visitor) = 0;
};

class Visitor
{
public:
	virtual void VisitElementA(Element*ele) = 0;

};




class ConCreateVisitor :public Visitor
{
public:

	void VisitElementA(Element *ele)
	{
		ele->Print();
	}
};

class ConCreateElementA :public Element
{
public:
	virtual void Accept(Visitor *visitor)override
	{
		visitor->VisitElementA(this);
	}
};




void testVisitor()
{
	Element *ele = new ConCreateElementA;
	Visitor *vis = new ConCreateVisitor;

	ele->Accept(vis);

}


© 著作权归作者所有

梦想游戏人
粉丝 41
博文 472
码字总数 184853
作品 0
成都
私信 提问
设计模式22——Visitor设计模式

Visitor访问者设计模式是在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升。 Visitor访问者设计模式的角色: (1) 访问者角色(Visitor):声明一个访问接...

小米米儿小
2014/01/27
196
0
设计模式笔录(二),设计模式有哪些

本人出道5年,学习、编程、再学习、再编程一路走过,只是在笔和纸留下些脚印,实感惭愧。现开始把自己学习到的心得,实践中的体会,一一贴在互联网上,大家互相学习、探讨,寻找一些技术朋友...

方旭
2011/03/31
778
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
2018/07/20
103
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
160
0
《PHP设计模式大全》系列分享专栏

《PHP设计模式大全》已整理成PDF文档,点击可直接下载至本地查阅 https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页...

kaixin_code
2018/11/06
204
0

没有更多内容

加载失败,请刷新页面

加载更多

一篇文章教你轻松使用fastjson

前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的...

Java3y
28分钟前
4
1
分组功能(tapply,by,aggregate)和* apply系列

每当我想在R中做“ map” py任务时,我通常都会尝试在apply系列中使用一个函数。 但是,我从未完全理解它们之间的区别-{ sapply , lapply等}如何将函数应用于输入/分组输入,输出将是什么样...

javail
29分钟前
4
0
PHP环境搭建之单独安装

还在使用PHP集成环境吗?教你自定义搭建配置PHP开发环境,按照需求进行安装,安装的版本可以自己选择,灵活性更大。 目录: 1. 安装Apache 2. 安装PHP 3. 安装MySQL 4. 安装Composer 观看:h...

不冷的大叔
40分钟前
4
0
为什么JavaScript变量会以美元符号开头?

我经常看到JavaScript带有以美元符号开头的变量。 您何时/为什么选择以这种方式为变量添加前缀? (我不是在问您在jQuery和其他语言中看到的$('p.foo')语法,而是普通变量,例如$name和$orde...

技术盛宴
44分钟前
4
0
TCP 三次握手

https://my.oschina.net/u/4198159/blog/3141874

奋斗的小牛
53分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部