装饰模式的C++实现——设计模式学习(1)

news/2024/12/2 20:28:42/

编程目的:理解装饰模式及其用法。

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP]

装饰模式是一种结构型设计模式,它允许在运行时动态地给对象添加新的行为。这种模式是通过创建一个包装器来实现的,该包装器包含原始对象,并在运行时添加新的行为。在这个过程中,不需要修改原始对象的代码,因此装饰模式是一种非常灵活的模式。

下面是装饰模式的C++实现:

首先,我们需要定义一个基本的组件类,表示我们要给它添加新的行为的对象。在这个例子中,我们以一个简单的字符串类为例:

class Component {
public:virtual ~Component() {}virtual std::string operation() const = 0;
};

接下来,我们需要实现具体的组件类。在这个例子中,我们以一个简单的字符串类为例:

class ConcreteComponent : public Component {
public:std::string operation() const override {return "ConcreteComponent";}
};

然后,我们需要定义一个装饰器类,用于包装具体的组件并添加新的行为:

class Decorator : public Component {
public:Decorator(Component* component) : component_(component) {}std::string operation() const override {return component_->operation();}
protected:Component* component_;
};

最后,我们可以实现具体的装饰器类来添加新的行为:

class ConcreteDecoratorA : public Decorator {
public:ConcreteDecoratorA(Component* component) : Decorator(component) {}std::string operation() const override {return "ConcreteDecoratorA(" + Decorator::operation() + ")";}
};class ConcreteDecoratorB : public Decorator {
public:ConcreteDecoratorB(Component* component) : Decorator(component) {}std::string operation() const override {return "ConcreteDecoratorB(" + Decorator::operation() + ")";}
};

在这个例子中,我们定义了两个具体的装饰器类,ConcreteDecoratorA和ConcreteDecoratorB。这些装饰器类都是从Decorator类继承而来的,它们的构造函数都接受一个指向组件对象的指针,并将其存储在类成员变量中。在这些具体的装饰器类中,我们重写了操作方法,以便添加新的行为。

现在,我们可以使用这些类来创建一个具有多个行为的对象:

Component* component = new ConcreteComponent();
Component* decoratorA = new ConcreteDecoratorA(component);
Component* decoratorB = new ConcreteDecoratorB(decoratorA);
std::cout << decoratorB->operation() << std::endl;

在这个例子中,我们首先创建了一个具体的组件对象。然后,我们用ConcreteDecoratorA装饰它,并将结果存储在decoratorA变量中。接下来,我们再用ConcreteDecoratorB装饰decoratorA,并将结果存储在decoratorB变量中。最后,我们输出decoratorB的操作结果,它将包含所有添加的行

为。

对于这个例子,如果我们输出decoratorB的操作结果,它将会是以下内容:

ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))

这是因为我们首先将ConcreteComponent装饰成ConcreteDecoratorA,然后再将结果装饰成ConcreteDecoratorB,因此最终的结果包含了所有添加的行为。

需要注意的是,在使用装饰模式时,我们应该避免创建过多的装饰器对象,否则可能会导致代码变得难以维护。此外,我们还应该仔细设计装饰器类的继承结构,以确保它们之间的关系清晰明确。


http://www.ppmy.cn/news/45094.html

相关文章

【实用】解决.gitignore文件不生效

文章目录 背景原因解决方法 背景 针对&#xff1a;.gitignore文件不生效&#xff0c;哪怕是将某个目录、文件加入到忽略规则里 原因 .gitignore只能忽略那些原来没有被追踪的文件如果某些文件已经被纳入了版本管理中&#xff0c;那么修改.gitignore是无效的。 解决方法 先把本…

python实现将给定列表划分为元素和大致相等的两个子列表

假设现有列表[300,150,75,38,19,9,5,2]&#xff0c;我想把它划分为两个子列表&#xff0c;并要求两个列表的元素和大致相等&#xff0c;应该如何做&#xff1f; 这是一个很有意思的问题&#xff0c;我们期待的答案应该是&#xff1a; list1: [300] list2: [150,75,38,19,9,5,…

如何让心情保持平静?100多条禅修心法

静的层次和阶段 静首先是不要去争&#xff0c;没有任何争的心&#xff0c;没有任何杂念心。静有几个层次阶段&#xff1a; ⒈. 自己的心情相对于自己平静&#xff0c;是平静的第一个阶段。 ⒉. 第二个平静的阶段是&#xff1a;别人觉得你很静&#xff0c;自己也很静&#xf…

面试题整理

1、new关键字干了什么&#xff1f; let a new Object() let a Object() let a {} 都会创建一个新对象 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 function Person(name) { // 构造函数Person()this.name name;// this.prototype Obj…

Python中的@cache巧妙用法

缓存是一种空间换时间的策略&#xff0c;缓存的设置可以提高计算机系统的性能&#xff0c;这篇文章主要介绍了Python中的cache巧妙用法,需要的朋友可以参考下 Python中的cache有什么妙用&#xff1f; 缓存是一种空间换时间的策略&#xff0c;缓存的设置可以提高计算机系统的性…

游戏运营专员的职责有哪些?提高游戏收入的关键是什么?

游戏运营是将一款游戏平台推入市场&#xff0c;通过对平台的运作&#xff0c;使用户从接触、认识、再到了解实际线上的一种操作、最终成为这款游戏平台的忠实玩家的这一过程。同时通过一系列的营销手段达到提高线上人数&#xff0c;刺激消费增长利润的目的。 游戏运营专员的职…

安装pandas遇到No module named ‘_bz2’ 的解决方案

出现这个问题我们可以按照这篇博客去解决&#xff1a; https://blog.csdn.net/bf96163/article/details/128654915 如果解决不了&#xff0c;可以这样去做&#xff1a; 1.确保安装了 对应的库 // ubuntu安装命令 sudo apt-get install bzip2-devel // centos安装命令 sudo y…

【RabbitMQ】Spring整合RabbitMQ、Spring实现RabbitMQ五大工作模式(万字长文)

目录 一、准备 1、创建maven项目​编辑 2、引入依赖 3、创建配置文件 1.RabbitMQ配置文件 2.生产者项目配置文件 3.消费者项目配置文件 二、生产者xml中文件创建队列 三、生产者xml文件中创建交换机以及绑定队列 1、创建交换机 2、绑定队列 四、消费者xml文件中创建…