《装饰器模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c++版)》-CSDN博客


模式说明:

  • 方案: 装饰类和派生类同根,然后装饰类中放一个派生类,以在接口不动的情况下增加功能
  • 优点: 可以灵活地扩展对象功能,相比继承更易读。
  • 缺点: 增加了许多小对象,易于出错,不易调试。

本质思想: 派生类和装饰类都继承Base,然后装饰器类中放一个Base指针,存派生类。这样装饰器类和派生类可以放一个数组中,调用相同接口,这样部分类的功能看起来像被装饰了。前面是核心思想,基于这个再扩展,很容易基于装饰器加装饰器,或者把有相似接口的装饰器抽象出一个装饰器基类。

实践建议:

  • 注意组合关系,确保装饰器和被装饰对象之间的接口一致。
  • 装饰器的功能应该是可组合的,可叠加的。

代码示例:

cpp 复制代码
#include <iostream>

// Component Interface
class Bird {
public:
    virtual void fly() const = 0;
};

// Concrete Component
class Sparrow : public Bird {
public:
    void fly() const override {
        std::cout << "Sparrow is flying." << std::endl;
    }
};

// Concrete Decorator
class RedFeatherDecorator : public Bird {
private:
    Bird *bird;

public:
    explicit RedFeatherDecorator(Bird *b) : bird(b) {}

    void fly() const override {
        bird->fly();
        std::cout << "With red feathers." << std::endl;
    }
};

int main() {
    Bird *sparrow = new Sparrow();
    Bird *redSparrow = new RedFeatherDecorator(sparrow);

    redSparrow->fly();

/* 
输出:
    Sparrow is flying.
    With red feathers.
*/
    delete sparrow;
    delete redSparrow;

    return 0;
}
相关推荐
倒头就睡的小比特6 天前
算法竞赛C++常用的STL
c++·算法
weilx12346 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!6 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读6 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛6 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车6 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光6 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·6 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁6 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven6 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法