loki有感: 访问者模式

一,请输出类名和m_x值。不需要处理CRoot类,只需处理A,B类。CRoot还有一些派送类,也不考虑。

class CRoot

{

public:

int m_x;

};

class A : public CRoot

{

public:

A()

{

m_x = 1;

}

};

class B : public CRoot

{

public:

B()

{

m_x = 2;

}

};

参考答案:

#include <iostream>

using namespace std ;

class CRoot

{

public:

virtual void Show()=0;

int m_x;

};

class A : public CRoot

{

public:

A()

{

m_x = 1;

}

virtual void Show()

{

cout << "类A:" << m_x << endl;

}

};

class B : public CRoot

{

public:

B()

{

m_x = 2;

}

virtual void Show()

{

cout << "类B:" << m_x << endl;

}

};

void main()

{

CRoot* p1 = new A;

CRoot* p2 = new B;

p1->Show();

p2->Show();

}

二,假定:一,CRoot的派送类不会增加。二,CRoot、A、B属于某公司,另外一个公司在他的基础上进行二次开发。二次开发的公司无法修改

这些类,而他们需要经常增加功能,所以希望有一个通用接口。

此情况下:可以使用访问者模式。

#include <iostream>

using namespace std ;

class A;

class B;

class IVistor

{

public:

virtual void VistorA(A& a)=0;

virtual void VistorB(B& a)=0;

};

class CRoot

{

public:

virtual void Accept(IVistor& v)=0;

int m_x;

};

class A : public CRoot

{

public:

A()

{

m_x = 1;

}

virtual void Accept(IVistor& v)

{

v.VistorA(*this);

}

};

class B : public CRoot

{

public:

B()

{

m_x = 2;

}

virtual void Accept(IVistor& v)

{

v.VistorB(*this);

}

};

class CNewVistor : public IVistor

{

public:

void VistorA(A& a)

{

cout << "类A:" << a.m_x << endl;

}

void VistorB(B& b)

{

cout << "类B:" << b.m_x << endl;

}

};

void main()

{

CNewVistor v;

CRoot* p1 = new A();

CRoot* p2 = new B();

p1->Accept(v);

p2->Accept(v);

}

三,不修改CRoot、A、B(现实中很可能没权限修改)。增加新功能:输出A,B等类的类名和m_x的平方。

增加新类

class CNewVistor2 : public IVistor

{

public:

void VistorA(A& a)

{

cout << "类A:" << a.m_x*a.m_x << endl;

}

void VistorB(B& b)

{

cout << "类B:" << b.m_x*b.m_x << endl;

}

};

v的类型改变。

CNewVistor2 v;

时间: 2024-11-26 16:51:45

loki有感: 访问者模式的相关文章

访问者模式

在阎宏博士的<JAVA与模式>一书中开头是这样描述访问者(Visitor)模式的: 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变.从定义可以看出结构对象是使用访问者模式的必备条件,而且这个结构对象必须存在遍历自身各个对象的方法 访问者模式结构: 访问者角色(Visitor): 为该对象结构中具体元素角色声明一个访问操作接口. 具体访问者角色(Concrete Visitor): 实现每个由

那些开发中用到的模式——访问者模式

为了尽可能演示出Visitor 设计模式的强大之处,在此举一个开发中的场景例如 开发A组 负责做log功能,而B组需要A组暴露一个API,可以拿到所有的log. A组的代码实现可能是如下这样的: public abstract class OrderLog{ public string Content {get;set;} public OrderLog(string content){ Content = content; } } public class PlaceOrderLog :Ord

Android学习之访问者模式详解

本文和大家分享的主要是android设计模式中的访问者模式相关内容,一起来看看吧,希望对大家学习android有所帮助. 访问者模式 访问者模式属于行为模式. 访问者模式中属于相对比较复杂的一类,它会在A中让B访问,而实际在B中实际调用的是A的方法. class A { public void method1(){ System.out.println("AAAAAA"); } public void method2(B b){ b.showA(this); } } class B {

大话设计模式读书笔记--23.访问者模式

定义 访问者模式定义: 表示一个作用于某对象结构中的各元素的操作,它使你在不改变各元素的类的前提下,定义作用于这些元素的新操作 把数据结构, 和作用于数据结构上的操作,分离 模式结构 代码实现 场景: 男人和女人谈恋爱,男人的状态和女人的状态 代码实现:点击下载 特点和使用场景 优点:很容易增加新的操作 缺点: 使增加新的数据结构变得困难 使用场景: 数据结构相对稳定的系统

【设计模式】访问者模式

在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作. 介绍 意图:主要将数据结构与数据操作分离. 主要解决:稳定的数据结构和易变的操作耦合问题. 何时使用:需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,使用访问者模式将这些

访问者模式(Visitor Pattern)

访问者模式:使用一个访问者类,改变元素的行为.通过这种方式,随着访问者的改变,被访问者的行为可以被改变. 类图: 实现Master接口的具体类是行为需要被改变的对象. 实现Visitor接口的具体类是访问者,访问者不同,实现Master接口的具体类的行为不同. public interface Master { public abstract String getName(); } public class ConcreteMaster implements Master { private S

(转)访问者模式

原文:http://blog.csdn.net/zhengzhb/article/details/7489639 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 类型:行为类模式 类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由.我们首先来看一个简单的例子,代码如下: [java] view plaincopy class A { public void method1(){ System.o

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

?定义:表示一个作用于某对象结构中的歌元素的操作,可以使你在不改变个元素的类的前提下定义作用于这些元素的操作. 当需要扩展一个已有类的层次结构时,我们一般只需要简单增加一些方法来扩展的行为,会出现已有对象和需要扩展的行为不一致的情况,这种情况下不修改层次结构中的类就无法扩展其行为.访问者模式可以解决这个问题. 1.Visitor 抽象访问者角色,为该对象结构中具体元素角色声明一个访问操作接口.该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色,这样访问者就可以通过该元素角色的特定

JAVA设计模式之 访问者模式【Visitor Pattern】

一.概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为"对象结构",访问者通过遍历对象结构实现对其中存储的元素的逐个操作.访问者模式是一种对象行为型模式. 二.适用场景 当有多种类型的访问者(或是操作者) 对一组被访问者对象集合(或是对象结构)进行操作(其中对象集合也包含多种类型对象