面试十二、装饰器模式

        装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

装饰器模式的主要优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
  • 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
  • 装饰器模式完全遵守开闭原则

        其主要缺点是:装饰器模式会增加许多子类,过度使用会增加程序得复杂性。

装饰器模式的结构与实现

        通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰器模式的目标。

#include <iostream>
// 通过装饰器增强类的功能class  Car{
public:virtual void show()=0;
};// 三个实体的汽车类
class Bmw:public Car{
public:void  show(){std::cout<< "这是一辆宝马汽车,配置有:基本配置 " <<std::endl;}
};class Audi:public Car{
public:void  show(){std::cout<< "这是一辆奥迪汽车,配置有:基本配置 " <<std::endl;}
};class Benz: public Car{
public:void  show(){std::cout<< "这是一辆奔驰汽车,配置有:基本配置 " <<std::endl;}
};// 装饰器的基类
//class CarDecorator: public Car{
//public:
//    CarDecorator(Car *p):pCar(p){
//    }
//    virtual void show()=0;
//private:
//    Car *pCar;
//};// 装饰器1
class ConcreteDecorator01 :public Car{
public:ConcreteDecorator01(Car *p):pCar(p){}void show(){pCar->show();std::cout<< "定速巡航" << std::endl;}
private:Car *pCar;
};// 装饰器2
class ConcreteDecorator02 :public Car{
public:ConcreteDecorator02(Car *p):pCar(p){}void show(){pCar->show();std::cout<< "自动刹车" << std::endl;}
private:Car *pCar;
};int main(){Car *p1 = new ConcreteDecorator01(new Bmw());p1 =new ConcreteDecorator02(p1);p1->show();Car *p2 = new ConcreteDecorator01(new Audi());p2->show();Car *p3 = new ConcreteDecorator01(new Benz());p3->show();
}

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

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

相关文章

Flink GateWay、HiveServer2 和 hive on spark

Flink SQL Gateway简介 从官网的资料可以知道Flink SQL Gateway是一个服务&#xff0c;这个服务支持多个客户端并发的从远程提交任务。Flink SQL Gateway使任务的提交、元数据的查询、在线数据分析变得更简单。 Flink SQL Gateway的架构如下图&#xff0c;它由插件化的Endpoi…

Lua中文语言编程源码-第八节,更改loadlib.c 动态库加载器函数, 使Lua加载中文库关键词(加载库,搜索路径,引入)

源码已经更新在CSDN的码库里&#xff1a; git clone https://gitcode.com/funsion/CLua.git 在src文件夹下的loadlib.c 动态库加载器函数&#xff0c;此模块包含适用于具有dlfcn的Unix系统的loadlib实现&#xff0c;适用于Windows系统的实现&#xff0c;以及适用于其他系统的…

探秘开源隐语:架构深度剖析与隐私计算技术之旅

1.隐语架构 隐语&#xff08;SecretFlow&#xff09;作为蚂蚁集团开源的可信隐私计算框架&#xff0c;其架构设计具有多层次的特点&#xff0c;虽然具体分层名称可能会根据实际描述略有差异&#xff0c;但我们可以依据已有的技术和信息对其进行结构化的拆解&#xff1a; 硬件层…

如何使用Excel创建一个物品采购表

在企业的日常运营中&#xff0c;物品采购是一个常见且重要的活动。有效的采购管理不仅可以确保企业及时获得所需物资&#xff0c;还可以控制成本、提高效率。Microsoft Excel是一个功能强大的工具&#xff0c;它可以帮助我们创建和管理物品采购表。本文将详细介绍如何使用Excel…

Lua | 一篇文章讲清Lua语法及热更新

目录 一、环境搭建 二、Lua语法 1.输出print、单行注释、多行注释 2.变量 &#xff08;1&#xff09;nil &#xff08;2&#xff09;number &#xff08;3&#xff09;string &#xff08;3.1&#xff09;字符串长度 &#xff08;3.2&#xff09;字符串拼接 &#xf…

归并算法详细解析

归并排序 1945年&#xff0c;约翰冯诺依曼&#xff08;John von Neumann&#xff09;发明了归并排序&#xff0c;这是典型的分治算法的应用。归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Di…

数学建模(Topsis python代码 案例)

目录 介绍&#xff1a; 模板&#xff1a; 案例&#xff1a; 极小型指标转化为极大型&#xff08;正向化&#xff09;&#xff1a; 中间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 区间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 标…

在Java中使用Apache POI保留Excel样式合并多个工作簿

背景 在日常工作中&#xff0c;我们经常需要将多个Excel文件合并成一个&#xff0c;同时保留原有的样式和格式。Apache POI是一个流行的Java库&#xff0c;用于读取和写入Microsoft Office格式的文件&#xff0c;包括Excel。然而&#xff0c;仅仅使用Apache POI的基本功能进行…

RequestResponse使用

文章目录 一、Request&Response介绍二、Request 继承体系三、Request 获取请求数据1、获取请求数据方法&#xff08;1&#xff09;、请求行&#xff08;2&#xff09;、请求头&#xff08;3&#xff09;、请求体 2、通过方式获取请求参数3、IDEA模板创建Servlet4、请求参数…

WEB 表单练习题

任务如图&#xff1a; <html><head><meta charest"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><body><table width"…

第二十八章 配置 Web Gateway 的默认参数 - 与 IRIS 的连接

文章目录 第二十八章 配置 Web Gateway 的默认参数 - 与 InterSystems IRIS 的连接(一)与 IRIS 的连接Server Response TimeoutQueued Request TimeoutNo Activity TimeoutApply timeout to all ConnectionsEvent Log LevelEvent Log FileRetain All Log Files 第二十八章 配置…

Apache Commons-Configuration2 堆栈溢出漏洞复现 (CVE-2024-29131)

免责声明 由于传播、利用本CSDN所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担! 一、产品介绍 Apache Commons Configuration2 是 Apache Commons 组件库中的一个项目,用于处理配置文件的读取、解…

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

算法沉淀——贪心算法七(leetcode真题剖析)

算法沉淀——贪心算法七 01.整数替换02.俄罗斯套娃信封问题03.可被三整除的最大和04.距离相等的条形码05.重构字符串 01.整数替换 题目链接&#xff1a;https://leetcode.cn/problems/integer-replacement/ 给定一个正整数 n &#xff0c;你可以做如下操作&#xff1a; 如果…

数据结构:堆的创建和使用

上一期我们学习了树和二叉树的定义&#xff0c;其中我们了解到了两种特殊的二叉树&#xff1a;满二叉树和完全二叉树。 今天我们还要学习一种新的结构&#xff1a;堆 那这种结构和二叉树有什么联系呢&#xff1f;&#xff1f;&#xff1f; 通过观察我们可以发现&#xff0c;…

什么是通用人工智能(AGI)以及为什么它还没有到来:给AI爱好者的现实检查

人工智能通用智能(AGI)及其现状&#xff1a;AI爱好者的现实检验 引言 人工智能(AI)已经无处不在。从智能助手到自动驾驶汽车&#xff0c;AI系统正在改变我们的生活和商业。但是&#xff0c;如果有一种AI能够超越执行特定任务的能力呢&#xff1f;如果有一种AI能够像人类一样学…

pytorch之torch.save()和torch.load()方法详细说明

torch.save()和torch.load()是PyTorch中用于模型保存和加载的函数。它们提供了一种方便的方式来保存和恢复模型的状态、结构和参数。可以使用它们来保存和加载整个模型或其他任意的Python对象&#xff0c;并且可以在加载模型时指定目标设备。 1.语法介绍 1.1 torch.save()语法…

uni-app开发---4.首页

一、创建 home 分支 运行如下的命令&#xff0c;基于 master 分支在本地创建 home 子分支&#xff0c;用来开发和 home 首页相关的功能&#xff1a; git checkout -b home 二、配置网络请求 由于平台的限制&#xff0c;小程序项目中不支持 axios&#xff0c;而且原生…

ARM-UART实验

串口控制三盏灯亮灭 视频 串口实验验证.mp4 代码 uart4.c #include "uart4.h"void uart4_init() {//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR | (0x1<<1);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<6);//GPIOGRCC->MP_APB1ENSETR | (0X…

鸿蒙一次开发,多端部署(三)应用UX设计原则

设计原则 当为多种不同的设备开发应用时&#xff0c;有如下设计原则&#xff1a; 差异性 充分了解所要支持的设备&#xff0c;包括屏幕尺寸、交互方式、使用场景、用户人群等&#xff0c;对设备的特性进行针对性的设计。 一致性 除了要考虑每个设备的特性外&#xff0c;还…