当前位置: 首页 > news >正文

原型模式在C++中的实现与面向对象设计原则

引言

在软件开发中,原型模式是一种常用的设计模式,主要用于创建对象的克隆。通过原型模式,我们可以避免复杂的对象创建过程,尤其是当对象的初始化需要大量资源或复杂操作时。本文将通过一个具体的例子,详细介绍如何在C++中实现原型模式,并探讨其在面向对象设计原则中的应用。

实现步骤

  1. 定义基类

首先,我们需要定义一个基类YongYong,它将作为所有具体行为类的父类。基类中包含两个纯虚函数:clone()execute()

class YongYong {
public:virtual ~YongYong() {}virtual shared_ptr<YongYong> clone() const = 0;virtual void execute() const = 0;
};
  • clone():用于克隆当前对象,返回一个指向新对象的智能指针。
  • execute():用于展示具体的行为,每个子类将根据自己的行为实现该方法。
  1. 创建具体行为类

接下来,我们创建三个具体的行为类,分别继承自YongYong,并实现各自的clone()execute()方法。

拿着饭碗吃饭的行为类

class EatYongYong : public YongYong {
public:EatYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<EatYongYong>(*this);}void execute() const override {cout << "勇勇拿着饭碗在吃饭。" << endl;}
};

打压下属的行为类

class PressYongYong : public YongYong {
public:PressYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<PressYongYong>(*this);}void execute() const override {cout << "勇勇在打压下属。" << endl;}
};

欺骗领导的行为类

class DeceiveYongYong : public YongYong {
public:DeceiveYongYong() {}shared_ptr<YongYong> clone() const override {return make_shared<DeceiveYongYong>(*this);}void execute() const override {cout << "勇勇在欺骗领导。" << endl;}
};
  1. 创建管理类

为了管理不同行为的YongYong对象,我们创建一个YongYongManager类。该类使用map存储不同行为的原型对象,并提供获取原型对象的方法。

class YongYongManager {
private:map<string, shared_ptr<YongYong>> prototypes;public:YongYongManager() {prototypes["eat"] = make_shared<EatYongYong>();prototypes["press"] = make_shared<PressYongYong>();prototypes["deceive"] = make_shared<DeceiveYongYong>();}shared_ptr<YongYong> getPrototype(const string& type) const {auto it = prototypes.find(type);if (it != prototypes.end()) {return it->second->clone();}return nullptr;}
};
  1. 使用管理类创建对象

main函数中,我们使用YongYongManager创建不同行为的YongYong对象,并调用它们的execute()方法。

int main() {YongYongManager manager;// 创建吃饭的勇勇shared_ptr<YongYong> yongYong1 = manager.getPrototype("eat");yongYong1->execute();// 创建打压下属的勇勇shared_ptr<YongYong> yongYong2 = manager.getPrototype("press");yongYong2->execute();// 创建欺骗领导的勇勇shared_ptr<YongYong> yongYong3 = manager.getPrototype("deceive");yongYong3->execute();return 0;
}

代码解释

基类YongYong

  • 虚析构函数:确保子类对象能够正确析构。
  • 纯虚函数clone():定义克隆方法,子类必须实现。
  • 纯虚函数execute():定义行为方法,子类必须实现。

具体行为类

每个具体行为类(如EatYongYong)都继承自YongYong,并实现以下方法:

  • 构造函数:初始化对象。
  • clone()方法:返回自身对象的克隆。
  • execute()方法:展示具体行为。

管理类YongYongManager

  • prototypes:存储不同行为的原型对象。
  • 构造函数:初始化原型对象。
  • getPrototype()方法:根据类型返回对应的原型对象的克隆。

main函数

  • 创建YongYongManager实例。
  • 使用getPrototype()方法获取不同行为的YongYong对象。
  • 调用execute()方法展示行为。

面向对象设计原则分析

  1. 单一职责原则(SRP)
  • 基类YongYong:职责明确,定义克隆和行为方法。
  • 具体行为类:每个类只实现一个具体行为。
  • 管理类YongYongManager:职责单一,管理原型对象。
  1. 开闭原则(OCP)
  • 基类YongYong:允许子类扩展行为,无需修改基类。
  • 管理类YongYongManager:通过添加新的行为类扩展功能,无需修改现有代码。
  1. 里氏替换原则(LSP)
  • 具体行为类:可以替换基类YongYong对象,确保代码正确性。
  1. 依赖倒置原则(DIP)
  • 管理类YongYongManager:依赖于抽象的YongYong接口,而不是具体实现。
  1. 接口隔离原则(ISP)
  • 基类YongYong:定义清晰的接口,无冗余方法。
  • 具体行为类:只实现需要的方法。
  1. 合成复用原则(CRP)
  • 管理类YongYongManager:通过组合管理对象,而不是通过继承复用代码。

总结

通过实现原型模式,我们成功地创建了不同行为的“勇勇”对象,并满足了多种面向对象设计原则。这种方法不仅提高了代码的可扩展性和可维护性,还展示了如何通过继承和接口实现灵活的行为管理。希望本文能够帮助读者更好地理解和应用原型模式以及相关的面向对象设计原则。

http://www.xdnf.cn/news/1246195.html

相关文章:

  • vue3 计算属性
  • 前端实现Excel文件的在线预览效果
  • 10-红黑树
  • LINUX 85 SHElL if else 前瞻 实例
  • Goby 漏洞安全通告| NestJS DevTools /inspector/graph/interact 命令执行漏洞(CVE-2025-54782)
  • 国内办公安全平台新标杆:iOA一体化办公安全解决方案
  • 机械学习--决策树(实战案例)
  • Linux和mysql练习题2
  • Electron-updater + Electron-builder + IIS + NSIS + Blockmap 完整增量更新方案
  • HTML 媒体元素概述
  • LeetCode 71~90题解
  • MongoDB 从3.4.0升级到4.0.0完整指南实战-优雅草蜻蜓I即时通讯水银版成功升级-卓伊凡|bigniu
  • Redis内存耗尽时的应对策略
  • # 【Java + EasyExcel 实战】动态列 + 公式备注 Excel 模板导出全流程(附完整代码)
  • 分布式文件系统06-分布式中间件弹性扩容与rebalance冲平衡
  • PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt
  • 行为模式-模板方法模式
  • 脚手架开发-准备配置-配置文件的准备项目的一些中间件
  • 超轻量级通用人脸检测模型解析:1MB以下的AI如何实现实时检测
  • VUE-第二季-02
  • 数据结构(14)链式结构二叉树
  • Java技术栈/面试题合集(4)-Spring篇
  • ENSP防火墙安全策略简单案例
  • vue3通过按钮实现横向滚动或鼠标滚动横坐标滚动
  • MousePlus鼠标右键增强工具v5.5.25,支持鼠标轮盘功能
  • Linux驱动25 --- RkMedia音频API使用增加 USB 音视频设备
  • Windows 远程管理 (WinRM)问题详解包括c#与python例子
  • C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
  • YooAsset源码阅读-Downloader篇
  • 本地使用uv管理的python项目怎么部署到服务器?