适配器模式(大话设计模式)C/C++版本

适配器模式

在这里插入图片描述

C++

#include <iostream>
using namespace std;
// 球员
class Player
{
protected:
    string name;

public:
    Player(string name) : name(name) {}
    virtual void Attack() = 0;
    virtual void Defense() = 0;
    virtual ~Player() {}
};
// 前锋
class Forwards : public Player
{
public:
    Forwards(string name) : Player(name) {}
    virtual void Attack()
    {
        cout << "前锋 " << name << "进攻" << endl;
    }
    virtual void Defense()
    {
        cout << "前锋 " << name << "防守" << endl;
    }
};

// 中锋
class Center : public Player
{
public:
    Center(string name) : Player(name) {}
    virtual void Attack()
    {
        cout << "中锋 " << name << "进攻" << endl;
    }
    virtual void Defense()
    {
        cout << "中锋 " << name << "防守" << endl;
    }
};

// 后卫
class Guards : public Player
{
public:
    Guards(string name) : Player(name) {}
    virtual void Attack()
    {
        cout << "后卫 " << name << "进攻" << endl;
    }
    virtual void Defense()
    {
        cout << "后卫 " << name << "防守" << endl;
    }
};

class ForeignCenter
{
public:
    void SetName(string name)
    {
        this->name = name;
    }
    string GstName()
    {
        return name;
    }
    void ForeignAttack()
    {
        cout << "外籍中锋 " << name << " 进攻" << endl;
    }
    void ForeignDefense()
    {
        cout << "外籍中锋 " << name << " 防守" << endl;
    }

private:
    string name;
};

// 适配器类 翻译者
class Translator : public Player
{
public:
    Translator(string name) : Player(name)
    {
        ym = new ForeignCenter;
        ym->SetName(name);
    }
    ~Translator()
    {
        if (ym != NULL)
            delete ym;
    }
    void Attack()
    { // 翻译者将Attack 翻译成 ForeignAttack
        ym->ForeignAttack();
    }
    void Defense()
    {
        ym->ForeignDefense(); // 翻译者将Defense 翻译成 ForeignDefense
    }

private:
    ForeignCenter *ym; // 外籍中锋
};
int main()
{
    Player *b = new Forwards("巴蒂尔");
    b->Attack();
    Player *c = new Guards("麦克格雷迪");
    c->Attack();
    Player *ym = new Translator("姚明"); // 姚明问: "Attack和Defense是什么意思?"
    ym->Attack();
    ym->Defense();
    return 0;
}

C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct Player
{
    char name[50];
    void (*attack)(const char *);
    void (*defense)(const char *);
} Player;

typedef struct Forwards
{
    Player base;
} Forwards;

typedef struct Center
{
    Player base;
} Center;

typedef struct Guards
{
    Player base;
} Guards;

typedef struct ForeignCenter
{
    char name[50];
} ForeignCenter;

typedef struct Translator
{
    Player base;
    ForeignCenter *foreignCenter;
} Translator;

void forwards_attack(const char *name)
{
    printf("前锋 %s 进攻\n", name);
}

void forwards_defense(const char *name)
{
    printf("前锋 %s 防守\n", name);
}

void center_attack(const char *name)
{
    printf("中锋 %s 进攻\n", name);
}

void center_defense(const char *name)
{
    printf("中锋 %s 防守\n", name);
}

void guards_attack(const char *name)
{
    printf("后卫 %s 进攻\n", name);
}

void guards_defense(const char *name)
{
    printf("后卫 %s 防守\n", name);
}

void foreign_center_attack(ForeignCenter *fc)
{
    printf("外籍中锋 %s 进攻\n", fc->name);
}

void foreign_center_defense(ForeignCenter *fc)
{
    printf("外籍中锋 %s 防守\n", fc->name);
}

Player *create_forwards(const char *name)
{
    Player *p = (Player *)malloc(sizeof(Player));
    strcpy(p->name, name);
    p->attack = forwards_attack;
    p->defense = forwards_defense;
    return p;
}

Player *create_center(const char *name)
{
    Player *p = (Player *)malloc(sizeof(Player));
    strcpy(p->name, name);
    p->attack = center_attack;
    p->defense = center_defense;
    return p;
}

Player *create_guards(const char *name)
{
    Player *p = (Player *)malloc(sizeof(Player));
    strcpy(p->name, name);
    p->attack = guards_attack;
    p->defense = guards_defense;
    return p;
}

Translator *create_translator(const char *name)
{
    Translator *t = (Translator *)malloc(sizeof(Translator));
    strcpy(t->base.name, name);
    t->foreignCenter = (ForeignCenter *)malloc(sizeof(ForeignCenter));
    strcpy(t->foreignCenter->name, name);
    t->base.attack = (void (*)(const char *))foreign_center_attack;
    t->base.defense = (void (*)(const char *))foreign_center_defense;
    return t;
}

void player_free(Player *p)
{
    free(p);
}

void translator_free(Translator *t)
{
    if (t->foreignCenter)
        free(t->foreignCenter);
    free(t);
}

int main()
{
    Player *b = create_forwards("巴蒂尔");
    b->attack(b->name);
    Player *c = create_guards("麦克格雷迪");
    c->attack(c->name);
    Translator *ym = create_translator("姚明");
    ym->base.attack(ym->base.name);
    ym->base.defense(ym->base.name);

    player_free(b);
    player_free(c);
    translator_free(ym);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

odoo 入库发票三大凭证

注意对应科目 库存计价凭证 原材料 成品 供应商账单凭证 银行账单凭证

人工智能驱动材料科学前沿:微软与PNNL联合推进电池材料创新

新型电池技术的研发对实现绿色能源目标具有决定性意义 微软公司与美国太平洋西北国家实验室&#xff08;PNNL&#xff09;近期开展了一项开创性的合作&#xff0c;利用尖端人工智能技术&#xff0c;在极短时间内完成对海量潜在电池材料的系统筛选。 微软和PNNL的研究团队采用了…

6.20学习总结

D - 刻录光盘https://vjudge.net/problem/%E6%B4%9B%E8%B0%B7-P2835 思路&#xff1a; 利用并查集和弗洛伊德&#xff0c;对需要传递的对象都进行标记&#xff0c;经过处理后使他们的父亲发生相应的改变&#xff0c;最后对数组进行查询累加即可 代码&#xff1a; #include<…

SqlSugar有实体CURD应用-C#

本文所述开发环境&#xff1a;.C#、NET8、Visual Studio2022 SqlSugar有实体查询数据表 首先根据《SqlSugar使用DbFirst对象根据数据库表结构创建实体类-C#》中的描述的表结构创建所有表的实体类如下&#xff1a; 表名创建的实体类名tb_studentStudenttb_teacherTeachertb_c…

IOS逆向分析—终极详细(三)

IOS逆向分析—终极详细&#xff08;三&#xff09; 前言一、逆向分析是什么&#xff1f;二、IDA分析1.下载并安装IDA2.安装插件3.加载二进制4.代码分析5.其它 总结 前言 本文是个人完成对IOS上APP分析的整个过程&#xff0c;当然对于不同的机型还会遇到不同的情况&#xff0c;谨…

NSSCTF-Web题目8

目录 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 3、思路 [NSSCTF 2022 Spring Recruit]babyphp 1、题目 2、知识点 3、思路 [LitCTF 2023]Http pro max plus 1、题目 2、知识点 http数据包头部字段 3、思路 打开题目 第一想法就是加上X-forwarded-for字段 …

【BES2500x系列 -- RTX5操作系统】CMSIS-RTOS RTX -- 实时操作系统的核心,为嵌入式系统注入活力 --(一)

&#x1f48c; 所属专栏&#xff1a;【BES2500x系列】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f49…

显卡nvidia的CUDA和cuDNN的安装

显卡版本&#xff0c;和nvidia下载的 CUDA版本和CUDNN的关系 1. 显卡版本 nvidia-smi 硬件环境&#xff1a;显卡版本 4090 NVIDIA-SMI-555.85 我的驱动是510.85.02&#xff0c;驱动附带cuda12.5 2. nvidia下载的cuda版本 nvcc -V 我下载的是cuda12.5 cuda在安装版本过程…

使用宝塔面板搭建Flask项目保姆级喂饭教程

目录 零.前言 一.准备工作 1.1创建requirements.txt文件 1.2将项目打包为压缩文件 1.3租一台服务器 1.4部署宝塔面板 二.宝塔面板(服务器)上的操作 2.1将本地Flask项目上传到服务器 2.2添加Python项目 2.3配置Python项目 2.4配置Nginx 2.5宝塔面板放行端口 2.6在服…

CoRR和arXiv

CoRR和arXiv到底是什么&#xff1f;_corr期刊-CSDN博客文章浏览阅读1.4w次&#xff0c;点赞8次&#xff0c;收藏10次。提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档CoRR和arXiv到底是什么文章目录一、arXiv二、CoRR前言 a…

性能测试-性能监控分析与调优(三)《实战》

性能监控 使用命令监控 cpu瓶颈分析 top命令 在进行性能测试时使用top命令&#xff0c;界面如下 上图可以看出 CPU 概况区&#xff1a; %Cpu(s): us&#xff08;用户进程占用CPU的百分比&#xff09;, 和 sy&#xff08;系统进程占用CPU的百分比&#xff09; 的数值很高…

【Unity设计模式】状态编程模式

前言 最近在学习Unity游戏设计模式&#xff0c;看到两本比较适合入门的书&#xff0c;一本是unity官方的 《Level up your programming with game programming patterns》 ,另一本是 《游戏编程模式》 这两本书介绍了大部分会使用到的设计模式&#xff0c;因此很值得学习 本…

通过git命令查询某个用户提交信息

要查询某个用户通过 Git 提交了多少行代码&#xff0c;可以使用以下步骤和命令来实现。这些命令将统计该用户的添加和删除的代码行数。 1、切换到你的 Git 仓库&#xff1a; cd /path/to/your/repositorygit命令结果&#xff1a; 2、查询所有用户&#xff1a; git log --pr…

原子性(juc编程)

原子性 概述&#xff1a;所谓的原子性是指在一次操作或者多次操作中&#xff0c;要么所有的操作全部都得到了执行并且不会受到任何因素的干扰而中断&#xff0c;要么所有的操作都不执行&#xff0c;多个操作是一个不可以分割的整体。 //比如说&#xff1a;你喂你女朋友吃冰淇…

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion

SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion 文章目录 SOFTS: Efficient Multivariate Time Series Forecasting with Series-Core Fusion1. 论文背景1.1 通道独立-通道依赖的区别1.2 论文贡献 2. 模型架构2.1 SOFTS的主要架构2.2 STAR 模…

《QT实用小工具·七十一》基于Qt+Qml开发的文件传输工具

1、概述 源码放在文章末尾 该项目基于QTQML实现了文件传输的功能&#xff0c;可以在局域网环境下使用(热点)&#xff0c;扫描使用UDP&#xff0c;传输使用TCP&#xff0c;每一个文件传输使用独立的线程进行处理&#xff0c;高效便捷。 开发环境 使用Qt/Qml开发 QT版本&#x…

搭建开发模式下的以太坊私有链【Geth:1.14.5】

一、为什么用到私有链&#xff1f; 在以太坊的公有链上部署智能合约、发起交易需要花费以太币。而通过修改配置&#xff0c;可以在本机搭建一套以太坊私有链&#xff0c;因为与公有链没关系&#xff0c;既不用同步公有链庞大的数据&#xff0c;也不用花钱购买以太币&#xff0…

Mybatis中BaseEntity作用

新建各种对象的时候&#xff0c;一般来说&#xff0c;有几个属性是所有对象共有的&#xff0c;比如说id,is_del&#xff0c;is_enable这些&#xff0c;然后设置一个基础对象&#xff0c;以后新建所有对象的时候都继承它&#xff0c;就省的每次都要写这些共有的属性了

生育是家庭和个人的重要的选择

生育是个人和家庭的重要选择&#xff0c;而国家对于生育政策的制定应该综合考虑多种因素&#xff0c;包括人口结构、经济发展和社会稳定等。同时&#xff0c;我们也应该认识到&#xff0c;男女不应该成为决定一个人是否能够生育的因素。男女在生育中扮演着不同的角色&#xff0…

在Maven工程中手动配置并测试SpringBoot(巨详)

本篇博客承继自博客&#xff1a; 在IDEA 2024.1.3 (Community Edition)中创建Maven项目_idea2024.1.3如何创建maven项目-CSDN博客 配置POM文件 打开工程中的pom.xml文件&#xff0c;先向其中写入 <parent><groupId>org.springframework.boot</groupId><…