【行为型】Visitor模式
访问者模式意图在不改变目标对象类结构的情况下,扩展对象类的行为。新扩展的行为均被封装成类对象的形式来动作。应用该模式时,往往目标类系与Visitor类系是两个不同的类系,它们配合工作但维护是分开的,互不影响。每次扩展一个新行为时,需要新增加一个Visitor派生类。而目标类系只需要接受Visitor对象即可。模式的类关系图参考如下:
模式编码结构参考如下:
namespace visitor
{
class Target;
class IVisitor
{
public:
// some code here........
virtual void doSomething(Target* pTarget) {
// do something here........
// such as: if (nullptr != pTarget) pTarget->........
} };//class IVisitor class ConcreteVisitor1 : public IVisitor
{
public:
// some code here........
virtual void doSomething(Target* pTarget) override {
// do something here........
// such as: if (nullptr != pTarget) pTarget->........
} };//class ConcreteVisitor1 class ConcreteVisitor2 : public IVisitor
{
public:
// some code here........
virtual void doSomething(Target* pTarget) override {// do something here........
// such as: if (nullptr != pTarget) pTarget->........
} };//class ConcreteVisitor2 class Target
{
public:
// some code here........
virtual void accept(IVisitor* pVisitor) {
// do something here........
// such as:
if (nullptr != pVisitor) {
pVisitor->doSomething(this);
}
} };//class Target class ConcreteTarget1 : public Target
{
public:
// some code here........
virtual void accept(IVisitor* pVisitor) override {
// do something here........
// such as:
if (nullptr != pVisitor) {
pVisitor->doSomething(this);
}
} };//class ConcreteTarget1 class ConcreteTarget2 : public Target
{
public:
// some code here........
virtual void accept(IVisitor* pVisitor) override {
// do something here........
// such as:
if (nullptr != pVisitor) {
pVisitor->doSomething(this);
}
} };//class ConcreteTarget2 }//namespace visitor
访问者模式编码结构参考
访问者模式在不改动原有类结构的情况下即可扩展类对象的新的行为且不改变原有结构,这在对象类结构比较固定且比较完善,但又需要或有可能会扩展一些特殊的行为操作时特别有用。尤其在设计工具库等场合,可适应考虑为将来可能的新业务变动预留接口。其实有玩过objective-c的人,在看到该模式时,可能会想到objective-c语言的一个技术:在使用别人封装的对象时,可以重新为该对象扩展新的接口,同样也是不需要改变别人封装的对象。其实这个技术与该模式的意图是类似的。
访问者模式的好处是显而易见的,其允许我们自由扩展新的行为特性,但这也是其重大缺点,因为势必会破坏对象的封装特性(当然,像C++这样的语言还有friend可用,对于该特性的破坏还有一定的挽回余地,但friend其实质上就已是在破坏封装特性了)。另外,由于Visitor类系的引入,系统中维护的类将增多,且无形当中也会增加一定量的Visitor类系的实例对象。再者,新扩展一个Target类系类型时,则有可能会让Visitor类系产生较大的改动(这个可能还需要视实际的项目设计者的设计方案而定)。
【行为型】Visitor模式的更多相关文章
- 完成C++不能做到的事 - Visitor模式
拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据他们提出的意见适当修改代码并提交,一周的任务就完成了.剩 ...
- Visitor模式,Decorator模式,Extension Object模式
Modem结构 Visitor模式 对于被访问(Modem)层次结构中的每一个派生类,访问者(Visitor)层次中都有一个对应的方法. 从派生类到方法的90度旋转. 新增类似的Windows配置函数 ...
- 设计模式之visitor模式,人人能懂的有趣实例
设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么 ...
- 设计模式:基于线程池的并发Visitor模式
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...
- Visitor 模式心得
最近读到Visitor模式,还是一知半解的.偶然翻到Uncle Bob对该模式的推导过程,有所心得,和大家分享一下. Uncle Bob 的链接是: http://butunclebob.com/Ar ...
- Java 的双重分发与 Visitor 模式
双重分发(Double Dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」. 这种父类的引用指向子类对象 ...
- 【转载】完成C++不能做到的事 - Visitor模式
原文: 完成C++不能做到的事 - Visitor模式 拿着刚磨好的热咖啡,我坐在了显示器前.“美好的一天又开始了”,我想. 昨晚做完了一个非常困难的任务并送给美国同事Review,因此今天只需要根据 ...
- 设计模式之——visitor模式
visitor模式,又叫访问者模式,把结构和数据分开,编写一个访问者,去访问数据结构中的元素,然后把对各元素的处理全部交给访问者类.这样,当需要增加新的处理时候,只需要编写新的 访问者类,让数据结构可 ...
- Visitor模式(访问者设计模式)
Visitor ? 在Visitor模式中,数据结构与处理被分离开来.我们编写一个表示"访问者"的类来访问数据结构中的元素, 并把对各元素的处理交给访问者类.这样,当需要增加新的处 ...
- Behavioral模式之Visitor模式
1.意图 表示一个作用于某对象结构中的各元素的操作.它使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 2.别名 无 3.动机 考虑一个编译器.他将源程序表示为一个抽象语法树.该编译器须 ...
随机推荐
- JQuery固定表头插件fixedtableheader源码注释
在开发XX车站信息系统时,需要将大量数据显示在一个巨大的表格内部,由于表格是一个整体,无法分页,加之数据很多,超出一屏,为了方便用户,决定使用固定表头的插件,经过测试,发现JQuery 插件:fixe ...
- 数学概念——G 最大公约数
G - 数论,最大公约数 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- [基础] Python问题
1.中文字符被自动转成ASCII码,然后无论如何编解码都没法被某些函数识别,已然放弃,以后坚决不再使用中文路径 2.缺少什么工具就pip install xxx一下,很好用,就是有个下列Warning ...
- haffman树c实现
#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 100#define M 2*N-1t ...
- tessilstrona
Untitled Document
- Java 类加载机制详解
一.类加载器 类加载器(ClassLoader),顾名思义,即加载类的东西.在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘.网络或其他来源加载到内存中,并对字节码进行解 ...
- 英蓓特Mars board的android4.0.3源码编译过程
英蓓特Mars board的android4.0.3源码编译过程 作者:StephenZhu(大桥++) 2013年8月22日 若要转载,请注明出处 一.编译环境搭建及要点: 1. 虚拟机软件virt ...
- Mac OS X 程序员利器 – Homebrew安装与使用
Mac OS X 程序员利器 – Homebrew安装与使用 Homebrew安装与使用 什么是Homebrew? Homebrew is the easiest and most flexible ...
- 2016最新cocoapods版本更新,以及多个版本的问题
先删除之前的pod 在终端中执行下面命令. 删除目录下的podrm -rf /usr/local/bin/pod 执行gem list | grep cocoapods 查看所有与cocoapods相 ...
- mongoDb 给表添加+ 删除字段
1 .添加一个字段. url 代表表名 , 添加字段 content. 字符串类型. db.url.update({}, {$set: {content:""}}, {multi ...