关闭

设计模式之访问者模式,C++实现

2660人阅读 评论(0) 收藏 举报
分类:

设计模式不能滥用啊


先借一张图



// Visitor.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



// 访问者模式(vistor), 表示一个作用于某对象结构中的各元素的操作,
// 它使你可以在不改变各元素类的前提下定义作用于这些元素的操作

// 假设一个绘制软件,只能够绘制线面两种类型的图形
// 但是每个图形都有多种风格(有纹理,无纹理,三维模式,等等等等)



// 绘制方式

// 绘制方式,(风格)可以无限添加,从DrawAction中派生即可
// 每个派生类中都会重载对【线】和【面】的绘制
// 其特点是,绘制风格通过指针传递给绘制对象类,绘制对象类会根据自己的指针
// 调用绘制风格的两个绘制对象函数的一种,然后由绘制风格派生类来实现绘制方式


class DrawAction
{
public:
	virtual void DrawLine() = 0;
	virtual void DrawPolygon() = 0;
};

class DrawWithTexture : public DrawAction
{
public:
	void DrawLine()			{printf("绘制无纹理的线\n");}
	void DrawPolygon()		{printf("绘制无纹理的多边形\n");}
};

class DrawWithOutTexture : public DrawAction
{
public:
	void DrawLine()			{printf("绘制有纹理的线\n");}
	void DrawPolygon()		{printf("绘制有纹理的多边形\n");}

};

class DrawIn3DModel : public DrawAction
{
public:
	void DrawLine()			{printf("绘制3D模式下的线\n");}
	void DrawPolygon()		{printf("绘制3D模式下的多边形\n");}
};


class Element
{
public:
	virtual void Draw(DrawAction *visitor) = 0;
};


class Line : public Element
{
public:
	void Draw(DrawAction *visitor)
	{
		visitor->DrawLine();
	}
};


class Polygon : public Element
{
public:
	void Draw(DrawAction *visitor)
	{
		visitor->DrawPolygon();
	}
};



// 一般的做法是,将绘制对象封装,抽象类Element中只有一个Draw纯虚函数,以及一个SetDrawStyle(...)
// 函数,通过SetStyle将风格设置进来,然后在派生类的Draw函数中用switch case绘制
// (ps.我们现在的系统就是这样写的,还好吧,比较直观,还能保存绘制风格呢)

// 但是vistor这是一种双选择模式
// 绘制的时候需要知道绘制对象的种类,和绘制风格的种类
// 传给绘制对象的不是状态的枚举,而是一个类指针
// 因为传递的是类指针,所以可进行动态绑定,通过风格类指针来调用绘制函数

int _tmain(int argc, _TCHAR* argv[])
{
	Element *pLine = new Line;
	Element *pPoly = new Polygon;

	DrawAction *pHTex = new DrawWithTexture;
	DrawAction *p3DM  = new DrawIn3DModel;


	// 析构部分  略
	pLine->Draw(pHTex);
	pPoly->Draw(p3DM);

	return 0;
}

输出结果

绘制无纹理的线
绘制3D模式下的多边形
请按任意键继续. . .




2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C++设计模式实现--访问者(Visitor)模式

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作。它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 结构如下: 二. 举例 假设有一项...
  • L_Andy
  • L_Andy
  • 2014-07-04 16:12
  • 1228

我所理解的设计模式(C++实现)——访问者模式(Visitor Pattern)

我们去银行柜台办业务,一般情况下会开几个个人业务柜台的,你去其中任何一个柜台办理都是可以的。我们的访问者模式可以很好付诸在这个场景中:对于银行柜台来说,他们是不用变化的,就是说今天和明天提供个人业务的...
  • LCL_data
  • LCL_data
  • 2013-09-12 16:07
  • 18193

设计模式总结之Visitor Pattern(访问者模式)

表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
  • cooldragon
  • cooldragon
  • 2016-08-12 12:10
  • 3805

设计模式读书笔记-----访问者模式

生老病死乃常态,是我们每个人都逃脱不了的,所以进医院就是一件再平常不过的事情了。在医院看病,你首先的挂号,然后找到主治医生,医生呢?先给你稍微检查下,然后就是各种处方单(什么验血、CD、B超等等,太坑...
  • chenssy
  • chenssy
  • 2013-09-25 21:31
  • 9263

Java设计模式之访问者模式

本文属于23种设计模式系列,介绍访问者模式。
  • jason0539
  • jason0539
  • 2015-04-21 07:48
  • 8967

设计模式学习之访问者模式

访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是...
  • u012124438
  • u012124438
  • 2017-04-23 22:15
  • 6415

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

概念: 访问者模式(Visitor)行为设计模式。访问者模式被用在针对一组相同类型对象的操作。优点是,可以把针对此对象的操作逻辑转移到另外一个类上。用于数据结构和作用于结构上的操作解耦合,使得操作集合...
  • lqh517
  • lqh517
  • 2016-06-24 12:12
  • 296

大话设计模式—访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元...
  • lmb55
  • lmb55
  • 2016-04-04 23:32
  • 2156

java设计模式-访问者模式visit

一般场景:一个数据结构可以被多种不同对象访问操作; 类比:医院开的方子,可以被划价员计算医药费,可以被药房抓药,。。。 demo:  抽象访问者:Visitor.Java publ...
  • sidihuo
  • sidihuo
  • 2017-02-06 14:11
  • 1062

《大话设计模式》--男人和女人--访问者模式<Visitor>(28)

V:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱...
  • lovegonghui
  • lovegonghui
  • 2015-06-15 15:45
  • 457
    个人资料
    • 访问:185139次
    • 积分:3437
    • 等级:
    • 排名:第11273名
    • 原创:103篇
    • 转载:50篇
    • 译文:14篇
    • 评论:37条
    博客专栏
    文章分类
    站长统计