装饰器模式(c++)(单一职责型模式)

自制新型文字密码,聊天记录的画风都不一样了,再也不怕被女朋友偷窥手机了! 前言:当今社会是一个信息社会,你的个人信息和聊天记录极有可能被别有用心的人时时刻刻监视着,那么你想不想实现专属于两个人或一个小圈子的人在社交软件上的交流不被任何其他人读懂呢?下面就给大家提供一个原理极其简单程序极其容易实现的C语言文字加密小程序的实现算法。 PS:文章末尾有惊喜哦! 原理:ASCLL码的加减乘除运算。举一个最简单的例子,从键盘输入一行字符"LANGUAGE",将所有字符的ASCLL码加1后再打印出来就变成了"MBOHVBHF",将所有字符的ASCLL码加2,则打印出来是"NCPIWC 阅读详情

“单一职责模式”的适用场景

在软件组件设计中,如果责任划分的不清晰,使用继承得到的结果往往是随需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。

场景

某一天,你的老板写一堆log类来分别打印错误信息和警告信息。

class Log{
public:
	virtual void WriteLog(const char *data) = 0;
	virtual char ReadLog(int number) = 0;
};
class ErrorLog : public Log{
public:
	virtual void WriteLog(const char *data){
	}
	virtual char ReadLog(int number){
	}
};
class WarnLog: public Log{
public:
	virtual void WriteLog(const char *data){
	}
	virtual char ReadLog(int number){
	}
};
int main(void){
	Log *warnLog = new WarnLog();
	Log *errorLog = new ErrorLog();
	
	if(Error)
		errorLog->WriteLog("某个地方发生Error");

	if(Warn)
		warnLog->WriteLog("某个地方发生Warn");

	//经过很多次调用
	
	//假装忘记delete
	return 0;
}

这时候你解决了问题,完美下班。
but 过了几天,你老板发现,这样Log打印好像对性能负担很大,于是乎要求你先用一个Buffer储存这些log,然后再合适的时间打印这些log,于是你要写下面的类

class BufferErrorLog : public ErrorLog{
public:
	virtual void WriteLog(const char *data){
		//额外的BUffer操作
		ErrorLog::WriteLog(data);
	}
	virtual char ReadLog(int number){
		return ReadLog::ReadLog(number);
	}
};
class BufferWarnLog: public WarnLog{
public:
	virtual void WriteLog(const char *data){
		//额外的BUffer操作
		WarnLog::WriteLog(data);
	}
	virtual char ReadLog(int number){
		return WarnLog::ReadLog(number);
	}
};
int main(void){
	Log *warnLog = new BufferWarnLog();
	Log *errorLog = new BufferErrorLog();
	
	if(Error)
		errorLog->WriteLog("某个地方发生Error");
	//经过很多次调用
	//在一个合适的时候一次性输出了之前所有的Log
	if(Warn)
		warnLog->WriteLog("某个地方发生Warn");

	
	//假装忘记delete
	return 0;
}

现在视乎又解决了问题,

but又过了几天,你的老板发现直接输出log有点不安全,所以他决定在输出log的时候对log进行加密操作,并且他认为直接无Buffer的输出log是简单有效的,他觉定不舍弃直接输出的类,于是乎WarnLog,ErrorLog,BufferWarnLog,BufferErrorLog 这四个类都应该有一个子类是父类的加密(CryptoWarnLog,CryptoErrorLog,CryptoBufferWarnLog,CryptoBufferErrorLog)

本来这个项目有两个类(WarnLog,errorLog),加了Buffer功能之后这个项目就有了四个类(WarnLog,ErrorLog,BufferWarnLog,BufferErrorLog),再加个加密操作之后这个项目就有了八个类,再加一个功能,这个项目就有16个类,每加一种新的功能,类的数量成指数级(2n)增长。一旦多加几个功能,一个项目100,000类都不是梦。很明显这是不合理的,这时候就需要装饰器模式。

使用装饰器模式

装饰模式能够实现动态的为对象添加功能,是从一个对象外部来给对象添加功能。在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

//之前的log类,ErrorLog类和WarnLog类这里就不重写了,从Buffer开始

class DecoratorLog :public Log{
public:
	DecoratorLog(Log *log) :mLog(log){}

protected:
	Log *mLog;
};
//它是一个装饰器
class BufferLog :public DecoratorLog {
public:
	BufferLog(Log *log) :DecoratorLog (log){}
	virtual void WriteLog(const char *data){
		//额外的Buffer操作
		mLog->WriteLog(data);
	}
	virtual char ReadLog(int number){
		return mLog->ReadLog(number);
	}
};
//它是一个装饰器
class CryptoLog : public DecoratorLog {
public:
	CryptoLog(Log *log) :DecoratorLog (log){}
	virtual void WriteLog(const char *data){
		//额外的加密操作
		mLog->WriteLog(data);
	}
	virtual char ReadLog(int number){
		return mLog->ReadLog(number);
	}
};
int main(void){
	Log *warnLog = new BufferLog(new WarnLog());
	Log *errorLog = new BufferLog(new ErrorLog());
	
	if(Error)
		errorLog->WriteLog("某个地方发生Error");
	//经过很多次调用
	//在一个合适的时候一次性输出了之前所有的Log
	if(Warn)
		warnLog->WriteLog("某个地方发生Warn");

	
	//假装忘记delete
	return 0;
}

这时候,我只写了一个BufferLog类,就能实现BufferWarnLog类和BufferErrorLog 类的功能,就算再添加一个加密操作,也只是再写一个CryptoLog 类而已。这样写加几个功能,就加几个类,类的数量就是功能的数量(n)。

这样写代码有多个好处在上面的代码中没有体现

  1. 在装饰器类里面加一个setMLog方法,同一个装饰器可以重复使用。
  2. 通过xml配置文件和工厂模式,可以把装饰器的构造通过配置文件来决定,方便后续的更新。

类图

在这里插入图片描述

装饰器模式的优点:

  1. 可以轻松对已存在的对象进行修改和包装,在被装饰者的前面或者后面添加自己的行为,而无需修改原对象。

  2. 可以动态、不限量地进行装饰,可以更灵活地扩展功能。

相对地,装饰器模式有很明显的缺点:

  1. 会加入大量的小类,即使只添加一个功能,也要额外创建一个类,使得程序更复杂。

  2. 增加代码复杂度,使用装饰器模式不但需要实例化组件,还要把组件包装到装饰者中。

C++自定义log日记,简单方便使用 直接上代码,经过本人调式过,可以直接拿去使用代码 Logger.h // // Created by ts on 18-2-7. // #ifndef __LOGGER__ #define __LOGGER__ #include #include #include #include #include #include /// /// \brief 日志文件的类型 /// ty 阅读详情

相关推荐

EXE文件加密算法

EXE文件加密算法,通过抓取计算机特征,生成一串密码,写入exe中,需要的朋友可以自己下载,希望对你有帮助。

C++ | 面向对象思想(OOP)

面向对象的基本思想是:从现实世界中客观存在的事物出发来构造软件系统,并在系统的构造中尽可能地运用人类的自然思维方式。 面向对象更加强调运用人类在日常生活的逻辑思维中经常采用的思想方法与原则,如抽象、分类,继承、聚合、多态等。 OOP:面向对象编程,是一种计算机编程架构。 OOP 的一条基本原则是:计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 如下图,将实体的属性和行为抽象为对...

H_Expect的博客 582

FPGA时钟架构解密:从SRCC/MRCC到全局时钟树的实战指南

本文深入解析Xilinx 7系列FPGA时钟架构,从SRCC/MRCC引脚特性到全局时钟树设计,详细介绍了BUFG、BUFMR等关键组件的应用场景和优化策略。通过对比SRCC与MRCC的驱动范围及适用场景,提供低抖动时钟布线技巧和时钟域交叉(CDC)设计方法,帮助工程师构建高性能FPGA时钟系统。

weixin_29191081的博客 1483

单一职责原则(C++)

概念     就一个类而言,应该仅有一个引起它变化的原因。每个类实现一个功能。 简述     单一职责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为类实现过多的功能点,以保证实

先锋小牛 1511

人工智能,不止于模型:四步实现完整工作流

工程师越来越多地致力于将人工智能 (AI) 集成到自己的项目和应用中,同时不断着力提升自己的 AI 技能。面对 AI 问题,工程师首先要了解什么是 AI,以及如何将它纳入当前工作流,这看似简单,实则未必容易。在 Google 中搜索“什么是 AI?”会得到数百万条结果,包括不同程度的技术和相关信息。那么,对工程师而言,AI 意味着什么?人们对 AI 的关注主要集中在 AI 模型上,受此影响,工程师会迅速投入 AI 建模的研究。

r1832644594的博客 2809

瑞芯微RK3576开发实战:固件烧录与内核启动的典型问题解析

本文详细解析了瑞芯微RK3576开发板在固件烧录与内核启动过程中遇到的典型问题及解决方案。从开发工具版本检查、DDR配置调整到内核启动异常的设备树适配和电源管理问题,提供了系统性的调试方法和实用技巧,帮助开发者高效解决RK3576开发中的常见挑战。

weixin_33700350的博客 454

C++常用设计模式

简单工厂模式是一种创建型设计模式,它提供了一种通过一个工厂类来创建同一类型的不同产品对象的方法。在简单工厂模式中,我们首先定义一个抽象基类或者接口,它代表着所有可能被创建的对象的共性。然后我们编写具体的子类实现这个接口,并实现各自的构造函数和其他成员函数。最后,我们编写一个工厂类,根据客户端传递过来的参数,决定创建哪一个具体的对象子类,并返回该对象的指针或引用给客户端。在这个示例中,Product 类是抽象基类或者接口,该类定义了所有可能被创建的对象的共性。

qq_43119867的博客 1202

SAP 发货在途库存管理:POD确认差异下的2种后续调整方案对比

本文详细解析了SAP发货在途库存管理中POD确认差异后的财务调整方案,对比了移动类型417和555 T两种处理方式的适用场景及财务影响。通过实际案例说明如何优化POD流程,减少库存差异损失,提升供应链管理效率。特别适合SAP SD模块用户及供应链管理人员参考。

chiman6219的博客 394

入门设计原则C++实现一:单一职责原则

上面代码Animal类中的behavior方法做了所有操作,不管传入的参数是何值,执行的操作是固定的。但实际并不是我们想要的,比如当传入是燕子/鱼的时候,就会出现违背常理结果。究其原因就是animal类扮演的角色过多,处理出现异常了,这种就是违背的单一职责原则较为典型的例子。此时需要考虑将类拆分类1,类2, 类1负责功能A,类2负责功能B。变更引起的风险降低,变更是必不可少的,如果接口的单一职责做得好,一个接口修改只对相应的实现类有影响,对其他的接口无影响,这对系统的扩展性、维护性都有非常大的帮助。...

鲁点点的博客 656

从镜头到像素:深入解析Camera、Sensor与V4L2的协同工作流

本文深入解析了摄像头从物理成像到软件控制的完整工作流。详细介绍了镜头、传感器(Sensor)与V4L2框架的协同机制,涵盖光电转换、同步信号、ISP图像处理等核心环节,并通过实战演示了如何使用v4l2-ctl工具进行调试,为嵌入式开发和驱动调试提供系统指南。

weixin_29230805的博客 389

告别CMake依赖!在Visual Studio 2022中直接配置VTK 9.4开发环境(附完整项目示例)

本文详细介绍了如何在Visual Studio 2022中直接配置VTK 9.4开发环境,无需依赖CMake。通过图文教程和完整项目示例,帮助C++开发者快速集成VTK库,简化开发流程,提升工作效率。特别适合科学可视化任务的开发者。

weixin_26804345的博客 414

面试官问你如何进行程序设计?——设计模式之七大原则——单一职责、里氏代换、开闭原则、依赖倒转以及C++简单实现

工人方法模式工人方法模式1、背景2、定义3、特征4、应用参考 工人方法模式 1、背景 2、定义 3、特征 4、应用 参考

JMW1407的博客 2268

这才是 Python 的正确玩法!用强化学习 (RL) 训练 AI 玩《王者荣耀》,胜率 90%!

大家打排位时,一定遇到过那种“意识神级、操作零失误”的对手,或者“走位呆滞、送人头”的队友。以前的“人机”是程序员写死的脚本(If 血量<20% Then 回城)。而现在的顶级 AI(如腾讯绝悟、OpenAI Five),是靠强化学习 (Reinforcement Learning)自己“左右互搏”练出来的。今天,我们不谈枯燥的数学公式,我将手把手教你用,搭建一个能玩 MOBA 游戏的 AI Agent。即使不能去 KPL 打职业,虐一下钻石局还是绰绰有余的!

BUG猿的博客 1182

桥模式(c++)(单一职责型模式)

桥(Bridge)模式“单一职责模式”的适用场景场景使用桥模式类图 “单一职责模式”的适用场景 在软件组件设计中,如果责任划分的不清晰,使用继承得到的结果往往是随需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任。 场景 某一天,你的老板让你开发一个多媒体软件,其中包括音乐播放器,一个视频播放器和一个图片播放器。 class Player{ public: virtual vo...

Fawkess的博客 249

AgentScope深入分析-ReActAgent

ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。

842

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

[GeekBand] 面向对象的设计模式(C++)(1)

一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。 这样,你就能一次又一次 地使用该方案而不必做重复劳动。 0. 从面向对象谈起 底层思维与抽象思维: 底层思维要求程序员"向下"思考,去把握机器底层,从微观理解对象构造。这就包含了我们之前所学习的C++基本语法,封装,继承,多态这三大机制以及编译原理的相关内容。 抽象思维要求程序员"向上"思考,考虑如何让世界抽...

weixin_30508241的博客 71

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

第二七

工厂模式# 创建对象的工厂,使用者不必关心对象生成的过程,也就是不需要显示的调用new 操作符,只需要调用对象工厂暴露出来的创建对象的方法,并传入需要创建的对象的类型;缺点是扩展该工厂需要往工厂里不断加入子类,会使代码越来越臃肿 抽象工厂模式# 在工厂模式的基础上,有多个工厂,每个工厂负责创建同类型的对象, 抽象工厂实现了获取每个工厂实例的接口,使用者可以调用对应的方法获取对应类型工厂实例,使用该工厂可以创建对象;缺点和工厂模式一样,扩展麻烦 单例模式# 一个类只能被实例化一次,构造函数私有化,在类内部实例

ouhou999的博客 119

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

2024最新大厂C++校招面试真题合集,大厂面试百日冲刺 day16

考察对C++基本面向对象编程(OOP)概念的理解,包括封装、类与结构体的使用,以及对默认访问权限的理解。类:默认的访问权限是私有。结构体:默认的访问权限是公开。结构体可以定义成员函数,包括构造函数、析构函数、以及其他成员函数,和类在这方面是相同的。结构体和类都支持面向对象编程的特性,如封装和抽象。考察操作系统中多进程通讯机制多进程通讯方法包括管道、命名管道、信号、消息队列、共享内存、信号量、套接字等。

C/C++Linux、音视频、DPDK 411

装饰模式

装饰模式的优点和缺点:  (1)装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供更多的灵活性。 (2)通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。 (3)灵活性是把双刃剑,使用时比继承更容易出错。 众所周知很多时候买车都是要加装潢的,也就是所谓的QJ,增加车的功能就非常适用装饰模...

aclg25510的博客 132

怎样设计一个好架构:八个评价维度、四层思考深度,以及 23 种设计模式各自解决什么问题

架构要解决的是变化、理解、故障和协作的成本。本文从耦合、可迁移、可适配、复杂度等八个维度讲怎么评价架构,讲维度之间怎么取舍、架构思考可以分几层,再用可编译的 C 代码过一遍 23 种设计模式。

weixin_52400878的博客 317

工作流 vs 自主 Agent:5 种设计模式与 3 种建模方式详解

本文基于 Anthropic《Building Effective Agents》指南,系统梳理了AI应用中的两类核心架构:Workflow(编排式)与Agent(自主智能体)。强调“能画流程图就不上Agent”,提出从简单提示链到复杂自主决策的5种可组合工作流模式,并给出选型口诀与工程实践建议。核心观点:优先用确定性、可审计的Workflow,仅在任务路径未知时启用Agent,避免盲目复杂化。

分享大数据、java相关的技术 153

设计模式 - 访问者模式

概述 访问者模式(Visitor Pattern)是一种行为型设计模式,它通过为对象结构中的每个元素添加一个访问操作,使得可以在不改变元素类的前提下定义作用于这些元素的新操作。

2601_96797912的博客 178

设计模式速查

本文梳理12个核心设计模式,涵盖创建型、结构型与行为型,提供简洁Java实现与面试要点。重点解析单例(静态内部类)、工厂(方法/抽象)、建造者(链式构建)等高频模式,强调代码可维护性与扩展性,附速记口诀与对比表格,助力开发与面试双提升。

ttlovet的博客 161

设计模式与生活⑬:你坐几号线,谁来运营是另一回事

一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不

工一木子 221

【第四部分:Agentic 智能体设计模式】17. Agent 路由模式详解:从意图识别到动态模型选择

本文介绍 Agent Routing(路由模式)的基本原理与工程实现,重点分析任务路由、模型路由、工具路由和专业 Agent 路由的区别及适用场景。结合 BaseMetas EKA 企业知识助手,介绍规则与模型混合路由、Java Router 实现、复合任务处理、低置信度兜底和误路由评估,并以 Jev 专用决策模型、动态模型选择及 Tool Search 等近期技术为例,说明如何在保证权限与执行安全的前提下,提高 Agent 任务分发的准确性和效率。

weixin_42258782的博客 628

设计模式与生活⑩:地铁没变,你换了个状态

周二,没什么特别。小王照旧早起、吃早餐、坐地铁,到公司做日常开发。中午吃完饭,再去公司旁边遛一圈。普通的牛马的一天。地铁上倒有两个小片段。刚上去没座,他一只手扶杆,一只手刷手机。等他反应过来,已经坐过了一站。后来有了座,他靠着窗户,没一会儿睡着了。还是那班地铁,人已经从刷手机切到了睡觉还是小王,还是“列车到站”这件事,可他的反应已经不一样:刷手机时没留意,坐着清醒时会看站名,睡着后又听不见报站。今天聊的就是这个思路:**状态模式(State)——对象的内部状态变了,处理同一件事的方式也跟着变。

工一木子 174
上一篇: 观察者模式(c++)(组建协作型模式)
下一篇: 桥模式(c++)(单一职责型模式)
FawkesLi
博客等级 码龄8年 21粉丝 170原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值