9.访问者模式

简介: 1访问者模式的核心内容是: A:父类中存储一个作为关键字的变量。 B:子类根据这个关键的不同做不同的操作。 C:在访问的时候不用关心具体的内部实现方式,通过调用得出结论接口就可以得出结论。 2访问者模式的作用:送多个妹子花时,通过访问者模式实现根据特点做不同的配对。 3访问者模式具体描述 访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之

1访问者模式的核心内容是:

A:父类中存储一个作为关键字的变量。

B:子类根据这个关键的不同做不同的操作。

C:在访问的时候不用关心具体的内部实现方式,通过调用得出结论接口就可以得出结论。

2访问者模式的作用:送多个妹子花时,通过访问者模式实现根据特点做不同的配对。

3访问者模式具体描述

访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。

一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。

访问者模式适用于数据结构相对未定的系统,

它把数据结构和作用于结构上的操作之间的耦合解脱开,

使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,

就是增加一个新的访问者类。

访问者模式将有关的行为集中到一个访问者对象中,

而不是分散到一个个的节点类中。当使用访问者模式时,

要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。

访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

 

情人节到了,要给每个MM送一束鲜花和一张卡片,

可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,

我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor

让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,

这样就轻松多了。。

4.访问者模式类图

5.代码:

#include<iostream>

#include <list>

#include <string>

using namespace std;

//访问者模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。

//一旦这些操作需要修改的话,接受这个操作的数据结构可以保持不变。

//访问者模式适用于数据结构相对未定的系统,

//它把数据结构和作用于结构上的操作之间的耦合解脱开,

//使得操作集合可以相对自由的演化。访问者模式使得增加新的操作变的很容易,

//就是增加一个新的访问者类。

//访问者模式将有关的行为集中到一个访问者对象中,

//而不是分散到一个个的节点类中。当使用访问者模式时,

//要将尽可能多的对象浏览逻辑放在访问者类中,而不是放到它的子类中。

//访问者模式可以跨过几个类的等级结构访问属于不同的等级结构的成员类。

 

//情人节到了,要给每个MM送一束鲜花和一张卡片,

//可是每个MM送的花都要针对她个人的特点,每张卡片也要根据个人的特点来挑,

//我一个人哪搞得清楚,还是找花店老板和礼品店老板做一下Visitor

//让花店老板根据MM的特点选一束花,让礼品店老板也根据每个人特点选一张卡,

//这样就轻松多了。

 

//访问者模式不需要改变基类,不依赖虚函数

class Person

{

public:

    char * action;

    //获得结论

    virtual void getConclusion()

    {

    };

};

 

class Man :public Person

{

public:

    void getConclusion()

    {

        if (action == "成功")

        {

            cout << "男人成功时,背后多半有一个伟大的女人。" << endl;

        }

        else if (action == "恋爱")

        {

            cout << "男人恋爱时,凡事不懂装懂。" << endl;

        }

    }

};

 

class Woman :public Person

{

public:

    void getConclusion()

    {

        if (action == "成功")

        {

            cout << "女人成功时,背后多半有失败的男人。" << endl;

        }

        else if (action == "恋爱")

        {

            cout << "女人恋爱时,遇到事懂也装不懂。" << endl;

        }

    }

};

 

int main()

{

    list<Person*> persons;

 

    Person *man1 = new Man();

    man1->action = "成功";

    persons.push_back(man1);

 

    Person *woman1 = new Woman();

    woman1->action = "成功";

    persons.push_back(woman1);

 

    Person *man2 = new Man();

    man2->action = "恋爱";

    persons.push_back(man2);

 

    Person *woman2 = new Woman();

    woman2->action = "恋爱";

    persons.push_back(woman2);

 

    list<Person*>::iterator iter = persons.begin();

    while (iter != persons.end())

    {

        (*iter)->getConclusion();

        ++iter;

    }

 

    cin.get();

    return 0;

}

运行结果如下:


目录
相关文章
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
288 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
408 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
670 220
|
1天前
|
Windows
dll错误修复 ,可指定下载dll,regsvr32等
dll错误修复 ,可指定下载dll,regsvr32等
132 95
|
11天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1664 158
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
912 61