设计模式—装饰模式的C++实现

时间:2023-02-23 11:17:02

这是Bwar在2009年写的设计模式C++实现,代码均可编译可运行,一直存在自己的电脑里,曾经在团队技术分享中分享过,现搬到线上来。

1. 装饰模式简述

1.1 目的

动态地给一个对象添加一些额外的职责。

1.2 适用性

(1)  在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

(2)  处理那些可以取消的职责。

(3)  不能或不好采用生成子类的方法扩充职责。

2. 装饰模式结构图

设计模式—装饰模式的C++实现

  • Component:定义一个对象接口,可以给这些对象动态地添加职责。
  • ConcreteComponent:定义一个对象,可以给这个对象添加一些职责。
  • Decorator:维持一个只想Component对象的指针,并定义一个与Component接口一致的接口。
  • ConcreteDecorator:向组建添加职责。

3. 装饰模式的应用场景举例

3.1 程序日志类

  • 文件日志类
  • 控制台日志类
  • 数据库日志类
  • 网络日志类

使用者只调用写日志接口,对日志写到哪里,如何写并不是使用者所关心的,写日志的位置和内容变更也不关心。

设计模式—装饰模式的C++实现

3.2 数据库代理类

  • MySQL数据代理
  • Oracle数据代理
  • SQLServer数据代理
  • 网络数据中转代理类

使用者只想执行基本的数据库查询、插入、取结果操作,SQL符合规范,操作的是什么数据库,分布在哪里都不是他所关心的;即使数据库从SQLServer换成了MySQL,只要库表结构不变也不需要改代码。

设计模式—装饰模式的C++实现

4.  装饰模式C++实现示例

有两个背包:一个运动背包(平时打篮球、打羽毛球时背),一个户外背包(爬山、徒步时背),出去的时候偶尔会在背包上挂上一些挂饰。

设计模式—装饰模式的C++实现

代码实现:

Bag.hpp:

#ifndef BAG_HPP_
#define BAG_HPP_ #include <iostream> using namespace std; class CBag
{
public:
CBag(){}
virtual ~CBag(){} virtual void Operation() = ;
}; #endif /* BAG_HPP_ */

SportBag.hpp:

#ifndef SPORTBAG_HPP_
#define SPORTBAG_HPP_ #include <iostream>
#include "Bag.hpp" class CSportBag : public CBag
{
public:
CSportBag(){}
virtual ~CSportBag(){} virtual void Operation()
{
cout << "Sport bag ";
}
}; #endif /* SPORTBAG_HPP_ */

OutdoorBag.hpp:

#ifndef OUTDOORBAG_HPP_
#define OUTDOORBAG_HPP_ #include <iostream>
#include "Bag.hpp" class COutdoorBag : public CBag
{
public:
COutdoorBag(){}
virtual ~COutdoorBag(){} virtual void Operation()
{
cout << "Outdoor bag ";
}
}; #endif /* OUTDOORBAG_HPP_ */

DecoratorBag.hpp:

#ifndef DECORATORBAG_HPP_
#define DECORATORBAG_HPP_ #include "Bag.hpp" class CDecoratorBag : public CBag
{
public:
CDecoratorBag(CBag* pBag)
{
m_pBag = pBag;
} virtual ~CDecoratorBag(){} virtual void Operation()
{
m_pBag->Operation();
} private:
CBag* m_pBag;
}; #endif /* DECORATORBAG_HPP_ */

QmmDecoratorBag.hpp:

#ifndef QMMDECORATORBAG_HPP_
#define QMMDECORATORBAG_HPP_ #include <iostream>
#include "DecoratorBag.hpp" class CQmmDecoratorBag : public CDecoratorBag
{
public:
CQmmDecoratorBag(CBag* pBag) : CDecoratorBag(pBag)
{
} virtual ~CQmmDecoratorBag(){} virtual void Operation()
{
CDecoratorBag::Operation();
Hang();
} protected:
void Hang()
{
cout << "with accouterment QMM." << endl;
}
}; #endif /* QMMDECORATORBAG_HPP_ */

QggDecoratorBag.hpp:

#ifndef QGGDECORATORBAG_HPP_
#define QGGDECORATORBAG_HPP_ #include <iostream>
#include "DecoratorBag.hpp" class CQggDecoratorBag : public CDecoratorBag
{
public:
CQggDecoratorBag(CBag* pBag) : CDecoratorBag(pBag)
{
} virtual ~CQggDecoratorBag(){} virtual void Operation()
{
CDecoratorBag::Operation();
Hang();
} protected:
void Hang()
{
cout << "with accouterment QGG." << endl;
}
}; #endif /* QGGDECORATORBAG_HPP_ */

DecoratorMain.cpp:

#include <iostream>
#include "Bag.hpp"
#include "SportBag.hpp"
#include "OutdoorBag.hpp"
#include "DecoratorBag.hpp"
#include "QggDecoratorBag.hpp"
#include "QmmDecoratorBag.hpp" using namespace std; int main()
{
CBag* bag;
CBag* sportBag = new CSportBag();
CBag* outdoorBag = new COutdoorBag();
bag = new CQggDecoratorBag(sportBag); bag->Operation(); delete bag;
delete sportBag;
delete outdoorBag; return ;
}

设计模式—装饰模式的C++实现

设计模式—装饰模式的C++实现的更多相关文章

  1. 设计模式 装饰模式&lpar;Decorator&rpar;

    设计模式 装饰模式(Decorator) @author ixenos 装饰模式是什么 1.装饰模式以对客户端透明的方式对象的功能,是继承关系的一个替代方案,但装饰模式可以在不创造更多子类的情况下,对 ...

  2. c&plus;&plus;设计模式----装饰模式

    前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...

  3. Java设计模式---装饰模式

    装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的结构 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户 ...

  4. C&plus;&plus;设计模式——装饰模式

    前言 在实际开发时,你有没有碰到过这种问题:开发一个类,封装了一个对象的核心操作,而这些操作就是客户使用该类时都会去调用的操作:而有一些非核心的操作,可能会使用,也可能不会使用:现在该怎么办呢? 将这 ...

  5. 设计模式--装饰模式Decorate(结构型)

    一.装饰模式 动态地给一个对象添加额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活.有时我们希望给某个对象而不是整个类添加一些功能. 二.UML图 1.Component(概念中提到的对象接口 ...

  6. &lbrack;工作中的设计模式&rsqb;装饰模式decorator

    一.模式解析 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰模式的要点主要是: 1.需要对已有对象扩展新的功能,又不希望改变原有对 ...

  7. 深入浅出设计模式——装饰模式(Decorator Pattern)

    模式动机 一般有两种方式可以实现给一个类或对象增加行为: 继承机制,使用继承机制是给现有类添加功能的一种有效途径,通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静 ...

  8. Java设计模式-装饰模式(Decorator)

    顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下: Source类是被装饰类,Decorator类是一个 ...

  9. javascript设计模式-装饰模式

    装饰模式:在不改变原类(对象)和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象.在设计原则中,有一条,多用组合,少用继承,装饰模式正是这一原则的体现. UML ...

随机推荐

  1. Servlet处理Cookie

    1.CGI:进程,servlet:线程 2.HttpServletResponse下的方法就没有get开头的,(PrintWriter)getWriter在ServletResponse下. 3.st ...

  2. 关于数据表命名为mysql保留的时候的操作

    今天操作数据表的时候,发现order数据表无法进行操作,必须加上反单引号才能进行操作,查了一下原因: 反引号是用来区别mysql关键字的,比如,如果你有一个表名叫select,你就必须写成`selec ...

  3. 网络测试工具netperf

    Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求 ...

  4. Python爬虫小白入门(五)PhatomJS&plus;Selenium第二篇

    一.前言 前文介绍了PhatomJS 和Selenium 的用法,工具准备完毕,我们来看看如何使用它们来改造我们之前写的小爬虫. 我们的目的是模拟页面下拉到底部,然后页面会刷出新的内容,每次会加载10 ...

  5. 写给Android App开发人员看的Android底层知识(2)

    (五)AMS 如果站在四大组件的角度来看,AMS就是Binder中的Server. AMS全称是ActivityManagerService,看字面意思是管理Activity的,但其实四大组件都归它管 ...

  6. Maven项目中获取classpath和资源文件的路径

     假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么java文件夹和resources文件夹在运行时就是cl ...

  7. 【亲测有效】运行docker ps 出现Got permission denied问题的解决方案

    问题描述 今天在运行 docker ps 命令的时候出现如下问题: Got permission denied while trying to connect to the Docker daemon ...

  8. javascript之for循环的几种写法

    背景 javascript中的for循环选择多种多样,可你知道其中的差别在哪里吗?什么时候又该用哪种循环才是最佳策略?以上这些是本文想讨论的,欢迎交流. 说明 1.20年前的for循环 //20年前的 ...

  9. GDB调试基础

    GDB调试基础 https://lesca.me/archives/gdb-basic-knowledge.html GDB笔记(二):条件断点.命令列表.监视点 https://lesca.me/a ...

  10. DotNetBar&period;MetroTilePanel 样式、加载数据、获取数据

    描述下:MetroTilePanel包含子集ItemContainer  子集下面又包含子集MetroTileItem  目前我用到的就是这三层 因为需求所以整个模块全部由代码实现 1.ItemCon ...