C++设计模式::代理模式(combination)-可运行

news2024/11/15 12:14:20

实现:
    1) cImage:抽象类;
       cImageReal:派生类, 不可直接实例化;
       cImageProxy:派生代理类, 可直接实例化用来代理cImageReal;
    NOTICE:派生代理类用来简化对特定派生类的使用.

使用:
    实例化代理类, 然后使用.

1) 设计框架

        /*image.hpp*/
#pragma once
#ifndef __IMAGE__HPP
#define __IMAGE__HPP
#include <string>

namespace __proxy{

class cImage{
public:
  virtual ~cImage();
protected: 
  cImage();
public:
  virtual void display() = 0;
};

}
#include "image_real_proxy.hpp"

#endif

        /*image_real_proxy.hpp*/
#pragma once
#ifndef __IMAGE_REAL_PROXY_HPP
#define __IMAGE_REAL_PROXY_HPP
#include "image.hpp"
#include <string>

namespace __proxy{

class cImageReal:virtual public cImage{
public:
  cImageReal(std::string const &filename);
public:
  void display() override;
private:
  void loadFromDisk(std::string const &filename);
  std::string _M_filename;
};

}

namespace __proxy{

class cImageProxy:virtual public cImage{
public:
  cImageProxy(std::string const &filename);
public:
  void display() override;
private:
  cImageReal *_M_image = nullptr;
  std::string _M_filename;
};

}
#endif

2) 实现框架

        /*image.cpp*/
#include "image.hpp"
#include <stdio.h>

namespace __proxy{

cImage::~cImage()
{
  
}
cImage::cImage()
{
  
}

}

        /*image_real_proxy.cpp*/
#include "image_real_proxy.hpp"
#include <stdio.h>

namespace __proxy{

cImageReal::cImageReal(std::string const &filename)
{
  _M_filename = filename;
  loadFromDisk(_M_filename);
}
void cImageReal::display()
{
  printf("Displaying %s\n", _M_filename.c_str() );
}
void cImageReal::loadFromDisk(std::string const &filename)
{
  printf("Loading %s ... ok!\n", _M_filename.c_str() );
}

}

namespace __proxy{

cImageProxy::cImageProxy(std::string const &filename)
{
  _M_filename = filename;
}
void cImageProxy::display()
{
  if( nullptr == _M_image )
  {
    _M_image = new cImageReal(_M_filename);
  }

  if( _M_image != nullptr)
  {
    _M_image->display();
  }
}

}

3) 用户使用

#include "image.hpp"
#include <cstdlib>
#include <cstdio>

int main(int argc, char *argv[])
{
  if( argc != (1 + 1) ){
    fprintf(stderr, "Usage:%s <display-times>\n", argv[0]);
    return EXIT_FAILURE;
  }

  long long DISPLAY_TIMES = atoll(argv[1]);
  __proxy::cImage *image = new __proxy::cImageProxy("test_18mb.jpg");
  if( image != NULL)
  {
    printf("---------------------------------\n");
    image->display();

    printf("---------------------------------\n");
    for(long long idisp = 1; idisp < DISPLAY_TIMES; idisp++ )
    {
      image->display();
    }

    delete image, image = NULL;
  }

  return EXIT_SUCCESS;
}

4) 编译与运行

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

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

相关文章

解决Django报错 : No module named ‘MySQLdb‘

Django的版本是2.0&#xff0c;Python的版本号是3.6.4 在models.py创建好了模型类之后使用命令&#xff1a;python manage.py makemigrations 进行迁移&#xff0c;但是突然报错&#xff1a;ImportError:No module named MySQLdb 查询了相关资料发现python2.x版本是支持mysql…

条款38:对变化多端的线程句柄析构函数行为保持关注

条款37解释过&#xff0c;可联结的线程对应着一个底层系统执行线程&#xff0c;未推迟任务&#xff08;参见条款36&#xff09;的期值和系统线程有类似关系。这么一来&#xff0c;std::thread型别对象和期值对象都可以视作系统线程的句柄。 从这个视角来看&#xff0c;std::th…

springboot中配置bpmsjs插件-activiti7流程图绘制插件/IDEA中运行bpmnjs

BPMNJS的安装和使用需要依赖nodejs插件,需要先安装NODEJS,因为bpmnjs插件的运行需要使用到NODEJS中的npm命令。 安装nodejs 安装和使用bpmnjs插件,绘制activiti工作流需要的流程图。 1、安装和配置nodejs 2.1、下载nodejs https://nodejs.org/en 1.2、安装nodejs,默认安…

基于 Docker 的深度学习环境:Windows 篇

本篇文章&#xff0c;我们聊聊如何在 Windows 环境下使用 Docker 作为深度学习环境&#xff0c;以及快速运行 SDXL 1.0 正式版&#xff0c;可能是目前网上比较简单的 Docker、WSL2 配置教程啦。 写在前面 早些时候&#xff0c;写过一篇《基于 Docker 的深度学习环境&#xff…

C++设计模式::享元模式(combination)-可运行

实现: 1) cShape:抽象接口; cShape*:具体实现的接口; 2) cFactory:按照传入参数color来区别对象, 如果已经创建过, 那就返回已有的, 否则创建新的. 使用: 传入参数, 获取被创建的对象(创建尽可能少的对象) 1) 设计框架 /*shape.hpp*/ #pragma once #if…

CSS伪元素详解以及伪元素与伪类的区别

伪元素常常被误解为伪类&#xff0c;主要在于他们的语法相似&#xff0c;都是对于选择器功能的扩展&#xff0c;相似程度很高导致被混淆。 本文通过详细介绍伪元素和常见的使用方法&#xff0c;最后也会分析下伪元素与伪类的基本区别。 基本描述 CSS伪元素也是应用于选择器的…

渗透测试:Linux提权精讲(一)之sudo方法第一期

目录 写在开头 CVE-2019-14287 sudo apt和sudo apt-get sudo apache2 sudo ash sudo awk sudo base32/58/64/nc/z sudo cp sudo cpulimit sudo curl sudo date sudo dd sudo dstat sudo ed sudo env sudo exiftools 总结与思考 写在开头 在进行渗透测试获取…

sql server表值函数

一、创建测试表 Employees 二、创建表值函数 -- DROP FUNCTION TableIntSplit;CREATE FUNCTION TableIntSplit(Text NVARCHAR(4000),Sign NVARCHAR(4000)) RETURNS tempTable TABLE(Id INT ) AS BEGIN DECLARE StartIndex INT DECLARE FindIndex INT DECLARE Content VARCHAR(…

浅谈 Spring AOP 思想

Spring AOP AOP 切面编程普通代理类JDK动态代理Cglib动态代理AOPAOP术语AOP切面编程的优势Advice通知类型&#xff08;5种&#xff09;通知的执行顺序 Order切入点表达式表达式execution注解annotation Spring事务管理Transactional 及 Transactional 的两个属性Transactional …

AR开发平台 | 探索AR技术在建筑设计中的创新应用与挑战

随着AR技术的不断发展和普及&#xff0c;越来越多的建筑师开始探索AR技术在建筑设计中的应用。AR(增强现实)技术可以通过将虚拟信息叠加到现实场景中&#xff0c;为设计师提供更加直观、真实的建筑可视化效果&#xff0c;同时也可以为用户带来更加沉浸式的体验。 AR开发平台广…

SpringBoot项目连接数据库

1、找到applications.yml&#xff0c;如下图 2、写入代码 server:port: 9494spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/自己的数据库表名?serverTimezoneGMT%2b8username: rootpassword: root

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么&#xff1f; 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。…

修改整数(有点坑,所以发出来了)

问题描述 小贝给了小聪一个正整数 x&#xff0c;但是小聪决定把这个数改掉。她可以把整数 x 每个位置上的数 t 改成 9-t。 请你帮助小聪来计算一下&#xff0c;如何把 x 改成一个最小的正整数&#xff0c;注意&#xff0c;不能出现首位为 0 的情况。 输入格式 输入一个正整数…

Vue通过指令 命令将打包好的dist静态文件上传到腾讯云存储桶 (保存原有存储目录结构)

1、在项目根目录创建uploadToCOS.js文件 (建议起简单的名字 方便以后上传输入命令方便) 2、uploadToCOS.js文件代码编写 const path = require(path); const fs = require(fs); const COS = require(cos-nodejs-sdk-v5);// 配置腾讯云COS参数 const cos = new COS({SecretI…

NoSQL-Redis集群

NoSQL-Redis集群 一、集群&#xff1a;1.单点Redis带来的问题&#xff1a;2.解决&#xff1a;3.集群的介绍&#xff1a;4.集群的优势&#xff1a;5.集群的实现方式&#xff1a; 二、集群的模式&#xff1a;1.类型&#xff1a;2.主从复制&#xff1a; 三、搭建主从复制&#xff…

vscode 打开文件时如何在资源管理器中展开文件所在的整个目录树(包含node_modules)

如题。去 首选项 --> 设置 中 搜索 “Auto Reveal”&#xff0c;然后选true&#xff0c;注意把下面的Auto Reveal Exclude排除项中的node_modules去掉&#xff0c;这样才能定位到node_modules中的文件。 **/node_modules

【FPGA IP系列】FIFO的通俗理解

FPGA厂商提供了丰富的IP核&#xff0c;基础性IP核都是可以直接免费调用的&#xff0c;比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识&#xff0c;帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out&#xff0c;即先进先出。 FIFO是一个数…

函数重载与引用

文章目录 一、函数重载1. 重载规则2.重载列子3.函数名修饰规则 二、引用1.本质2.特性1. 引用必须在定义时初始化2 . 一个变量可以有多个引用3 . 引用一旦引用一个实体&#xff0c;就不能引用其他实体 3.引用例子4.引用的权限5.效率比较6.指针跟引用的区别 一、函数重载 函数重…

我的创作纪念日 --- 鲁迅文学无聊版

机缘 ------从第一次使用CSDN这个网站到现在已经快四年了&#xff0c;我大抵是病了&#xff0c;2021年7月29日才心血来潮写下来了第一篇自己的博客&#xff0c;回顾起来&#xff0c;已经过去了2年。如此这般&#xff0c;断断续续的写过一些博客&#xff0c;但终归是心血来潮罢了…

【Docker】Docker的优势、与虚拟机技术的区别、三个重要概念和架构及工作原理详细讲解

前言 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 作者简介&#xff1a; 辭七七&#xf…