原型模式(大话设计模式)C/C++版本

原型模式

C++

参考:https://www.cnblogs.com/Galesaur-wcy/p/15924300.html

#include <iostream>
#include <string>
using namespace std;

class WorkExprerience
{
private:
    string workDate;
    string company;

public:
    WorkExprerience() {}
    ~WorkExprerience() {}

    WorkExprerience(WorkExprerience *work)
    {
        this->workDate = work->workDate;
        this->company = work->company;
    }

    string getWorkDate()
    {
        return workDate;
    }

    void setWorkDate(string workDate)
    {
        this->workDate = workDate;
    }

    string getCompany()
    {
        return company;
    }

    void setCompany(string company)
    {
        this->company = company;
    }

    WorkExprerience *Clone()
    {
        return new WorkExprerience(this);
    }
};

class Prototype
{
protected:
    string name;
    string sex;
    string age;
    string timeArea;
    string company;

public:
    virtual void SetPersonalInfo(string sex, string age) = 0;
    virtual void Display() = 0;
    virtual Prototype &Clone() = 0;
};

class Resume : public Prototype
{
private:
    WorkExprerience *workExp;

public:
    Resume(string name)
    {
        this->name = name;
        workExp = new WorkExprerience();
    }
    ~Resume()
    {
        if (workExp != NULL)
            delete workExp;
    }
    void SetPersonalInfo(string sex, string age)
    {
        this->sex = sex;
        this->age = age;
    }
    void SetWorkExperience(string workDate, string company)
    {
        workExp->setCompany(company);
        workExp->setWorkDate(workDate);
    }
    void Display()
    {
        cout << name << "  " << age << " " << sex << "  " << endl;
        cout << "工作经历  " << workExp->getWorkDate() << "  " << workExp->getCompany() << endl;
    }
    Resume &Clone()
    {
        Resume *clonedResume = new Resume(name);
        clonedResume->SetPersonalInfo(sex, age);
        return *clonedResume;
    }
};

int main()
{
    Resume *a = new Resume("big bird");
    a->SetPersonalInfo("MAN", "22");
    a->SetWorkExperience("1998-2000", "baidu");

    Resume b = a->Clone();
    b.SetWorkExperience("2000-2008", "google");

    Resume c = a->Clone();
    c.SetWorkExperience("2010-2018", "apple");

    a->Display();
    b.Display();
    c.Display();

    return 0;
}

C

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

typedef struct
{
    char workDate[50];
    char company[50];
} WorkExperience;

typedef struct
{
    char name[50];
    char sex[10];
    char age[10];
    char timeArea[50];
    char company[50];
} PersonalInfo;

typedef struct Resume Resume;
struct Resume
{
    PersonalInfo info;
    WorkExperience *workExp;
    void (*display)(Resume *);
    Resume *(*clone)(Resume *);
};

void DisplayResume(Resume *resume);
Resume *CloneResume(Resume *original);

void InitWorkExperience(WorkExperience *exp)
{
    strcpy(exp->workDate, "");
    strcpy(exp->company, "");
}

void SetWorkExperience(WorkExperience *exp, const char *date, const char *company)
{
    strcpy(exp->workDate, date);
    strcpy(exp->company, company);
}

void DisplayWorkExperience(const WorkExperience *exp)
{
    printf("工作经历  %s  %s\n", exp->workDate, exp->company);
}

Resume *CreateResume(const char *name)
{
    Resume *resume = (Resume *)malloc(sizeof(Resume));
    strcpy(resume->info.name, name);
    strcpy(resume->info.sex, "");
    strcpy(resume->info.age, "");
    strcpy(resume->info.timeArea, "");
    strcpy(resume->info.company, "");
    resume->workExp = (WorkExperience *)malloc(sizeof(WorkExperience));
    InitWorkExperience(resume->workExp);
    resume->display = DisplayResume;
    resume->clone = CloneResume;
    return resume;
}

void DestroyResume(Resume *resume)
{
    if (resume)
    {
        if (resume->workExp)
            free(resume->workExp);
        free(resume);
    }
}

void SetPersonalInfo(Resume *resume, const char *sex, const char *age)
{
    strcpy(resume->info.sex, sex);
    strcpy(resume->info.age, age);
}

void SetWorkExperienceForResume(Resume *resume, const char *date, const char *company)
{
    SetWorkExperience(resume->workExp, date, company);
}

void DisplayResume(Resume *resume)
{
    printf("%s  %s %s  \n", resume->info.name, resume->info.age, resume->info.sex);
    DisplayWorkExperience(resume->workExp);
}

Resume *CloneResume(Resume *original)
{
    Resume *cloned = CreateResume(original->info.name);
    strcpy(cloned->info.sex, original->info.sex);
    strcpy(cloned->info.age, original->info.age);
    SetWorkExperienceForResume(cloned, original->workExp->workDate, original->workExp->company);
    return cloned;
}

int main()
{
    Resume *a = CreateResume("big bird");
    SetPersonalInfo(a, "MAN", "22");
    SetWorkExperienceForResume(a, "1998-2000", "baidu");

    Resume *b = a->clone(a);
    SetWorkExperienceForResume(b, "2000-2008", "google");

    Resume *c = a->clone(a);
    SetWorkExperienceForResume(c, "2010-2018", "apple");

    a->display(a);
    b->display(b);
    c->display(c);

    DestroyResume(a);
    DestroyResume(b);
    DestroyResume(c);

    return 0;
}

总结

在这里插入图片描述
关键在于实现一个Clone函数!!!
与拷贝构造函数相比就是:方便扩展,动态灵活定义拷贝行为(而且可被继承)

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

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

相关文章

收银系统源码-分销商城功能!

在当今的数字化时代&#xff0c;分销已经成为了一种非常流行的商业模式&#xff0c;它与我们的生活息息相关。 分销&#xff0c;简单来说&#xff0c;就是通过一定的渠道和方式&#xff0c;将商品或服务推广给更多的人&#xff0c;从而实现销售增长的过程。在生活中&#xff0…

告别照片丢失!掌握4个实用技巧,找回相册不再困扰

手机里的相册记录了我们的瞬间&#xff0c;捕捉了我们的笑容&#xff0c;让我们的回忆变得生动而具体。然而&#xff0c;随着科技的飞速发展&#xff0c;照片丢失的问题也随之而来。每当我们不小心删除了心爱的照片&#xff0c;那种失落感可能会让我们感到无所适从。那么&#…

Elasticsearch:智能 RAG,获取周围分块

作者&#xff1a;来自 Elastic Sunile Manjee 在检索增强生成 (RAG) 领域&#xff0c;一个持续存在的挑战是找到输入大型语言模型 (LLM) 的最佳数据量。数据太少会导致响应不足或不准确&#xff0c;而数据太多会导致答案模糊。这种微妙的平衡启发我开发了一个专注于智能分块和利…

免费听歌,电脑或手机免费听歌,落雪音乐安装详细步骤

近年来&#xff0c;由于资本的力量导致各种收费&#xff0c;看个电视想听歌都必须要付费了&#xff0c;否则你听不完整&#xff0c;吃相非常难看&#xff0c;特别是电视&#xff0c;吸血鬼式吸收各种会员费&#xff0c;各种APP也是铺天盖地的广告&#xff0c;渐渐迷失了自我&am…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

三个pdf工具和浏览软件(pdftk,muppdf,epdfview)

安装pdftk pdftk是一款功能强大的PDF处理工具&#xff0c;主要用于对PDF文件进行各种操作。它提供了丰富的功能&#xff0c;包括但不限于合并、拆分、旋转、加密、解密、添加水印、从PDF文档中解出附件等。pdftk分为图形界面版本和命令行版本&#xff0c;适用于不同的用户需求…

计算机网络(6) TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是互联网协议套件中一种核心协议。它提供面向连接的、可靠的字节流传输服务&#xff0c;确保数据从一端正确无误地传输到另一端。TCP的主要特点包括&#xff1a; 可靠性&#xff1a;TCP使用…

AIGC绘画设计:Midjourney V6 来袭,该版本有哪些新功能?

Midjourney V6 支持更自然的语言输入&#xff0c;可以处理更自然地对话式&#xff08;以前的版本是以关键字为中心的&#xff09;提示&#xff0c;对复杂提示有了更好的解释能力。大幅增加了每个 /image 的内存&#xff0c;可以处理更长、更详细的提示&#xff08;从40 直接提升…

一文理清sshc包的使用场景和掌握两种连接方式及异常场景

一文理清sshc、ssh包的使用场景和两种连接方式 SSH协议SSH&#xff08;Secure Shell&#xff09;协议支持通过多种编程语言实现客户端和服务端的功能&#xff0c;包括Go、Python、Java、C#等。 GO语言 sshc包的使用建立连接1.DialWithKey2.DialWithPasswd 运行命令异常场景思维…

北斗车载终端TD30助力户外出行现代化、信息化——保障无信号区域通信、实时精准定位

据官方统计&#xff0c;截至2023年9月底&#xff0c;全国机动车保有量达4.3亿辆&#xff0c;其中汽车3.3亿辆&#xff0c;新能源汽车1821万辆&#xff1b;机动车驾驶人5.2亿人&#xff0c;其中汽车驾驶人4.8亿人。车辆持有率的上升也带来车辆安全的考量&#xff0c;再者交通运输…

【linux】给net/socket.c部分接口添加pr_info后运行情况

net/socket.c 合入文件及代码&#xff1a; https://gitee.com/r77683962/linux-6.9.0/commit/d9aca07352311a9c185cbc2d3c39894e02f10df3 开机后dmesg命令运行效果&#xff1a; 这也是一部分&#xff0c;不过从这里看出来&#xff0c;添加打印日志的地方不太好&#xff0c;另…

CTFshow-web sql注入

Web171 1 在题目中可以看到查询语句为 "select username,password from user where username !flag and id ".$_GET[id]." limit 1;"; 直接使用万能密码 查到了所有用户 获得flag Web172 0 可以看到返回逻辑显示 如果返回的查询数据中username不等于fl…

随着Midjourney越来越成熟,它将给现实世界带来哪些影响?

Midjourney使用的过程中&#xff0c;你是不是会遇到这样的情况&#xff1f; 生成出来的图片压根不是自己想要的&#xff1f; 想要的风格根本不知道怎么写提示词&#xff1f; 不用担心&#xff0c;今天白白给大家带来了280种酷炫动作咒语&#xff0c;拿去&#xff0c;都能生成…

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…

Web3失败下互联网的未来转型之路

互联网的消亡已不再是夸大其词的说法。在大型科技巨头和生成式AI的推动下&#xff0c;网络的死亡螺旋正在加速&#xff0c;就像希腊神话中的蛇怪&#xff0c;象征着自我吞噬与永生。互联网已经开始自我喂养&#xff0c;并吐出最糟糕的部分供我们消费。 没有价值 Web3未能提供…

GPT-4搞不定的图推理,港科大7B模型搞定|KDD2024

大模型执行图推理任务&#xff0c;我们是希望大模型仅仅给出结果&#xff0c;还是在给出准确答案的同时&#xff0c;输出详细的推理过程&#xff1f; 先来看GPT-4的表现&#xff1a; 给出了一个非常简短且错误的答案&#xff08;判断该图中没有环&#xff09;&#xff0c;这可…

53.Python-web框架-Django开始第一个应用的多语言

针对上一篇的功能&#xff0c;本次仅对页面做了多语言&#xff0c;大家可以看看效果。 51.Python-web框架-Django开始第一个应用的增删改查-CSDN博客 目录 部门列表 新增部门 编辑部门 部门列表 源码 <!DOCTYPE html> {% load static %} {% load i18n %} <html …

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…

集成学习 #数据挖掘 #Python

集成学习是一种机器学习方法&#xff0c;它通过结合多个模型的预测结果来提高整体性能和稳定性。这种方法的主要思想是“集合智慧”&#xff0c;通过将多个模型&#xff08;比如决策树、随机森林、梯度提升机等&#xff09;的预测集成起来&#xff0c;可以减少单个模型的过拟合…