Vistor访问者模式(C++访问者模式)

Visitor模式在不破坏类的前提下,为类提供增加新的新操作。

Visitor模式经常用于将更新的设计封装在一个类中,并且由待更改的类提供一个接受接口,其关键技术在于双分派技术,Element类提供接口,通过Accept实现具体使用哪一个具体的Visit操作;

当然如果有很多的修改,便可以提供更多的Element的Visitor,但是会破坏系统的封装,并且难于扩展。

C++设计模式原书中的代码:

#include <iostream>
using namespace std;
class Element;

class Visitor
{
public:
	virtual ~Visitor(){}
	virtual void visitConElemA(Element* elm)=0;
	virtual void visitConElemB(Element* elm)=0;
protected:
	Visitor(){}
};

class ConcreteVisitorA:public Visitor
{
public:
	ConcreteVisitorA(){};
	virtual ~ConcreteVisitorA(){};
	void visitConElemA(Element* elm){cout<<"visit A";}
	void visitConElemB(Element* elm){cout<<"visit B";}
};

class ConcreteVisitorB:public Visitor
{
public:
	ConcreteVisitorB(){};
	virtual ~ConcreteVisitorB(){};
	void visitConElemA(Element* elm){cout<<"visit A";}
	void visitConElemB(Element* elm){cout<<"visit B";}
};

class Element
{
public:
	virtual ~Element(){};
	virtual void Accept(Visitor* vis)=0;
protected:
	Element(){};
};

class ConcreteElementA:public Element
{
public:
	ConcreteElementA(){}
	~ConcreteElementA(){}
	void Accept(Visitor* vis)
	{
		cout<<"This is A interface "<<endl;
		vis->visitConElemA(this);
	}
};

class ConcreteElementB:public Element
{
public:
	ConcreteElementB(){}
	~ConcreteElementB(){}
	void Accept(Visitor* vis)
	{
		cout<<"This is B interface ";
		vis->visitConElemB(this);
	}
};

void main()
{
	Visitor* vis=new ConcreteVisitorA();
	Element* elm=new ConcreteElementA();
	elm->Accept(vis);

	delete elm;
	delete vis;
}
时间: 2024-10-06 22:30:55

Vistor访问者模式(C++访问者模式)的相关文章

行为型模式之访问者模式

概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者.访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的操作. 在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为“对象结构”,访问者通过遍历对象结构实现对其中存储的元素的逐个操作

设计模式的征途—16.访问者(Visitor)模式

在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需要处理像处方单这样的集合对象结构,在该对象结构中存储了多个不同类型的对象信息,而且对同一对象结构中的元素的操作方式并不唯一,可能需要提供多种不同的处理方式.在设计模式中,有一种模式可以满足上述要求,其模式动机就是以不同的方式操作复杂对象结构,该模式就是访问者模式. 访问者模式(Visitor) 学习

访问者(Visitor)模式

http://www.cnblogs.com/zhenyulu/articles/79719.html 一. 访问者(Visitor)模式 访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. 问题提出 System.Collection命名空间下提供了大量集合操作对象.但大多数情况下处理的都是同类对象的聚集.换言之,在聚集上采取的操作都是一些针对同类型对象的同类操作.但是如果针对一个保存有不同类型对象的聚集采取某种操作该怎

(24):(行为型模式) Visitor 访问者模式

[所有分类] (24):(行为型模式) Visitor 访问者模式

Java设计模式(十一)访问者模式 中介者模式

(二十一)访问者模式 对已存在的类进行扩展,通常需要增加方法,但是如果需要的行为与现有的对象模型不一致,或者无法修改现有代码.在这种情况下,不更改类的层次结构,就无法扩展该层次结构的行为.如果运用了访问者模式,就可以支持开发人员扩展该类层次结构的行为. 和解释器模式一样,访问者模式通常是基于合成模式的. 访问者模式在不改变类层次结构的前提下,对该层次结构进行扩展. interface Visitor{ public void visit(VisiSubject sub); } interface

设计模式:访问者(Visitor)模式

设计模式:访问者(Visitor)模式 一.前言    什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫做访问,那么我们平常是怎么访问的,基本上就是直接拿着需要访问的地址(引用)来读写内存就可以了.    为什么还要有一个访问者模式呢,这就要放到OOP之中了,在面向对象编程的思想中,我们使用类来组织属性,以及对属性的操作,那么我们理所当然的将访问操作放到了类的内部,这样看起来没问题,但

java设计模式9.备忘录模式、访问者模式、调停者模式

备忘录模式 备忘录模式又叫快照模式,备忘录对象是一个用来存储另外一个对象内部状态快照的对象.备忘录的用意是在不破坏封装的条件下,将一个对象的状态捕捉,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态,备忘录模式常与命令模式和迭代子模式一起使用. 访问者模式 访问者的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变.访问者模式使适用于数据结构相对未定的系统,它把数据结构和作用于结构之上的操作解耦. 抽象访问者角色

23行为型模式之访问者模式

概念 Visitor模式也叫访问者模式,是行为模式之一,它分离对象的数据和行为,使用Visitor模式,可以不修改已有类的情况下,增加新的操作角色和职责. 角色和职责 抽象访问者(Visitor)角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口. 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作. 抽象节点(Element)角色:声明一个接受操作,接受一个访问者对象作为一个参量. 具体节点(Concret

设计模式-行为型模式-中介者模式

中介者要解决的问题 中介者模式(Mediator Pattern)是用来降低多个对象和类之间通信的复杂度.这种模式提供了一个中介类,该类通常用来处理不同类之间的通信.中介者模式符合迪米特原则,即一个类应当尽量减少与其他类的联系. 实例描述 在我们现实生活中就有这样的例子,你如果去租房,你可能会在网站上找一些发布租房的信息,找到对应的房东.为了能够找到性价比高的房子,你可能找好多家,那么你都要和这些房东打交道,留下电话啥的.有时候房子不好出租的情况下,房东还会主动联系你,就有了下面这幅图: 我们可

JavaScript设计模式一:工厂模式和构造器模式

转自:http://segmentfault.com/a/1190000002525792 什么是模式 前阵子准备期末考试,挺累也挺忙的,实在闲不得空来更新文章,今天和大家说说javascript中的设计模式. 首先呢,我们需要知道的是:模式是一种可复用的解决方案,而反模式呢就是针对某个问题的不良解决方案. js反模式常见例子 向setTimeout和setInterval传递字符串,而不是函数,这会触发eval()的内部使用. 在全局上下文中定义大量的变量污染全局命名空间 修改Object类的