c++设计模式-->访问者模式

news2024/11/20 8:39:36
#include <iostream>
#include <string>
#include <memory>
using namespace std;

class AbstractMember; // 前向声明

// 行为基类
class AbstractAction {
public:
    virtual void maleDoing(AbstractMember* member) = 0;
    virtual void femaleDoing(AbstractMember* member) = 0;
    virtual ~AbstractAction() {}
};

class Anger : public AbstractAction {
public:
    void fight() {
        cout << "I want to fight" << endl;
    }

    void warning() {
        cout << "I am warning" << endl;
    }

    void maleDoing(AbstractMember* member) override;
    void femaleDoing(AbstractMember* member) override;
};

class Horror : public AbstractAction {
public:
    void help() {
        cout << "I need help" << endl;
    }

    void think() {
        cout << "I am thinking" << endl;
    }

    void maleDoing(AbstractMember* member) override;
    void femaleDoing(AbstractMember* member) override;
};

// 抽象成员基类
class AbstractMember {
public:
    virtual void accept(AbstractAction* action) = 0;
    virtual ~AbstractMember() {}

    AbstractMember(string name) : mName(name) {}
    string getName() {
        return mName;
    }
protected:
    string mName;
};

class maleMember : public AbstractMember {
public:
    using AbstractMember::AbstractMember;
    void accept(AbstractAction* action) override {
        action->maleDoing(this);
    }
};

class femaleMember : public AbstractMember {
public:
    using AbstractMember::AbstractMember;
    void accept(AbstractAction* action) override {
        action->femaleDoing(this);
    }
};

// Anger and Horror methods implementation
void Anger::maleDoing(AbstractMember* member) {
    cout << "I am " << member->getName() << endl;
    fight();
}

void Anger::femaleDoing(AbstractMember* member) {
    cout << "I am " << member->getName() << endl;
    warning();
}

void Horror::maleDoing(AbstractMember* member) {
    cout << "I am " << member->getName() << endl;
    think();
}

void Horror::femaleDoing(AbstractMember* member) {
    cout << "I am " << member->getName() << endl;
    help();
}

int main() {
    unique_ptr<AbstractMember> maleAnger = make_unique<maleMember>("Luffy");
    unique_ptr<AbstractAction> angerAction = make_unique<Anger>();
    maleAnger->accept(angerAction.get());

    unique_ptr<AbstractMember> maleHorror = make_unique<maleMember>("Zoro");
    unique_ptr<AbstractAction> horrorAction = make_unique<Horror>();
    maleHorror->accept(horrorAction.get());

    unique_ptr<AbstractMember> femaleAnger = make_unique<femaleMember>("Nami");
    femaleAnger->accept(angerAction.get());

    unique_ptr<AbstractMember> femaleHorro = make_unique<femaleMember>("luobi");
    femaleHorro->accept(horrorAction.get());
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683122.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DFE_offset失调校准

1.校准原因 *制造工艺的限制&#xff1a;晶体管在制造过程中&#xff0c;由于工艺的限制&#xff0c;不可能做到完全对称&#xff0c;这导致了输入级晶体管的性能存在微小的差异。 *输入级偏置电流的不对称&#xff1a;输入级晶体管的偏置电流也会存在差异&#xff0c;这也会…

ASP+ACCESS基于B2C电子商务网站设计

摘 要 运用ASP技术结合了Access数据库原理&#xff0c;基于B/S模式我们开发了一个网上购物系统。在我们的系统中&#xff0c;顾客可以很方便的注册成为会员&#xff0c;对商品进行浏览检索&#xff0c;查看商品的详细资料&#xff0c;然后根据各人的喜好购买心仪的商品。系统…

kyuubi/spark3的catalog 多个数据源配置

在使用kyuubi 的时候&#xff0c;有多个集群&#xff0c;老集群上是hive2,新集群hive3 ,想通过一个网关访问多个集群&#xff0c;或者通过jdbc访问mysql&#xff0c;oracle的数据&#xff0c;这样不用来回数据导入导出。spark 支持跨库访问数据&#xff0c;在spark 中提供两种方…

DOS学习-目录与文件应用操作经典案例-xcopy

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.使用 三.案例 一.前言 xcopy命令是DOS系统中一个强大的文件和目录复制工具&…

SQLServer2022新特性IS [NOT] DISTINCT FROM

SQLServer2022新特性IS [NOT] DISTINCT FROM 1、本文内容 语法参数备注示例 比较两个表达式的相等性&#xff0c;并保证一个 true 或 false 结果&#xff0c;即使一个或两个操作数均为 NULL。 IS [NOT] DISTINCT FROM 这一谓词用于 WHERE 子句和 HAVING 子句的搜索条件中&a…

JAVA内存马查杀

JAVA内存马查杀 客户端请求流程 JAVA内存马类型 Servlet-API listener 内存马 filter内存马 Servlet内存马 特定框架分类 如Spring/Struts2等框架&#xff0c;按照位置分类可以有 interceptor controller 中间件分类 Tomcat的Pipeline&Valve Grizzly的FilterChain…

【东山派Vision K510开发板试用笔记】nncase的安装

概述 最近试用了百问网提供的东山派Vision开发板&#xff0c;DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板&#xff0c;主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发等用途。DongshanPI-Vision开发板采用嘉楠公司…

vue打包部署到springboot,通过tomcat运行

tomcat默认端口 8080springboot端口 9132vue 端口 9131 框架 项目是基于SpringBootVue前后端分离的仓库管理系统 后端&#xff1a;SpringBoot MybatisPlus前端&#xff1a;Node.js Vue element-ui数据库&#xff1a;mysql 一. 打包Vue项目 cmd中输入命令 npm run build 后…

Edge浏览器“此页存在问题”解决思路

Edge浏览器显示“此页存在问题”解决思路 大家平时使用Edge浏览器时&#xff0c;是否和我一样会突然出现“此页存在问题”的情况&#xff1f; 经过百度查询后我找了一种情况和解决办法&#xff0c;能够大大减少这类问题的出现。出现“此页存在问题”可能是因为之前使用过软件…

【Andoird开发】android获取蓝牙权限,beacon,android-beacon-library

iBeacon 最先是苹果的技术&#xff0c;使用android-beacon-library包可以在android上开发iBeacon 技术。 iBeacon的发明意义重大。它是一种基于蓝牙低功耗&#xff08;Bluetooth Low Energy, BLE&#xff09;技术的定位系统&#xff0c;通过向周围发送信号来标识其位置。这项技…

测试驱动编程(2)进阶单元测试(上)

文章目录 测试驱动编程(2)进阶单元测试&#xff08;上&#xff09;单元测试单元测试正确打开方式各类测试比较 TDD中的单元测试 测试驱动编程(2)进阶单元测试&#xff08;上&#xff09; 单元测试 要打造出出类拔萃的作品&#xff0c;你必须专注于最小的细节 单元测试正确打…

App玩转oCPX投放,打造低成本高转化的广告模型

随着广告主考核目标逐渐深化&#xff0c;以激活、注册等浅层指标为考核已经无法满足大部分广告主的投放诉求&#xff0c;越来越多的后端深化指标成为了广告主的核心诉求。OCPX应需而生&#xff0c;更好的助力广告主优化投放&#xff0c;全面提升转化效率。 在投放实践中&#…

【OpenGL纹理】纹理贴图基础知识(01/4)

文章目录 一、说明二、贴图的初始化处理2.1 贴图中的几种纹理2.2 原始数据处理 - 贴图的规格化 三、纹理对象生成和绑定&#xff08;选中&#xff09;3.1 生成纹理矩阵3.2 glGenTextures 函数明细3.2 glBindTexture函数明细 四、glTexParameteri函数4.1 贴放放法参数确定4.2 放…

ftp是什么,ftp能做什么,ftp有什么用 -----ftp介绍

大家好&#xff0c;我是风屿&#xff0c;今天开始我会给大家介绍一些关于网络方面的配置以及介绍等等&#xff0c;今天是ftp FTP中文名字叫做文件传输协议&#xff0c;英文名字叫做File Transfer Protocol&#xff08;简称为ftp&#xff09; FTP 是因特网网络上历史最悠久的网…

docker 安装RabbitMQ-web版本

直接拉去web版本 docker pull rabbitmq:management启动命令 设置用户名 admin 密码123456 docker run -dit --name rabbitmq -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USERadmin -e RABBITMQ_DEFAULT_PASS123456 rabbitmq:management访问地址 http://127.0.0.1:…

数据访问层设计_6.连接对象管理设计

1.数据库连接管理 在基于JDBC的数据库应用开发中&#xff0c;数据库连接的管理是一个难点&#xff0c;因为它是决定该应用性能的一个重要因素。 对于共享资源&#xff0c;有一个很著名的设计模式——资源池。该模式正是为了解决资源频繁分配、释放所造成的问题。把该模式应用到…

反射的基本知识

基本概念 反射是java在运行过程中的自我观察能力&#xff0c;通过class constructor field method 四个方法来获取一个类的各个组成部分。 反射是在运行状态中对于任意一个类&#xff0c;都能知道这个类的所有属性和方法&#xff1b;对于任意一个对象都能调用它的任意一个方法…

软件设计师备考笔记(九):数据库技术基础

文章目录 一、基本概念二、数据模型&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;E-R模型&#xff08;三&#xff09;数据模型 三、关系代数&#xff08;一&#xff09;关系数据库的基本概念&#xff08;二&#xff09;五种基本的关系代数运算&#xff08;三&…

2024 中青杯高校数学建模竞赛(B题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024 长三角高校数学建模竞赛&#xff08;A题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过…

sam代码简析

Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁移性)转移到新的图像分布和任务&#xff0c;一个图像分割新的任务、模型和数据集…