设计模式的 C++ 实现---代理模式

前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式

前言

代理模式即用一个类对象全权代表另外一个类对象,把真正干活的对象隐藏在幕后。代理对象和被代理的对象都是继承自同一基类,对外表现为相同的接口。
代理模式的本质是对被代理对象的一个再包装,可以滞后一个方法的调用操作,从而可以在调用前或者调用后增加一些控制方法,而对客户端来说和使用实际对象并没有区别。

实现举例

  1. 场景描述
    假设一个场景:界面中有一些文件的展示功能,但某些文件很的时候会有很长时间的构造过程,则会阻塞程序的运行,此时可以使用代理模式,直到真正使用文件时再真的进行构造。
  2. 抽象基类
#include <string>
#include <iostream>
using namespace std;

class File
{
public:
    File(const string &m_name):name(m_name){}
    virtual ~File(){}
    virtual void showFile() = 0;
protected:
    string name;

};
  1. 派生类
    在派生类的构造函数中模拟一个耗时的操作。
#include "file.h"
#include <QElapsedTimer>
#include <QCoreApplication>

class BigFile : public File
{
public:
    BigFile(const string &m_name):File(m_name)
    {
        longTimeConstruct();
    }
    void showFile() override
    {
        cout <<"展示文件:"<<name<<endl;
    }
private:
    void longTimeConstruct()
    {
        cout <<name<<" 开始构造..."<<endl;
        for( int i = 0;i < 10;++i)
        {
            QElapsedTimer  t;
            t.start();
            while(t.elapsed()<1000)
                QCoreApplication::processEvents();
        }
        cout <<name<<" 构造完成..."<<endl;
    }
};
  1. 代理类
#include "file.h"
#include "bigfile.h"

class BigFileProxy : public File
{
public:
    BigFileProxy(const string &m_name):File(m_name),m_bigfile(nullptr)
    {
        cout <<"代理构造完成..."<<endl;
    }
    ~BigFileProxy(){delete m_bigfile;}
    void showFile() override
    {
        cout << __FUNCTION__<<endl;
        if( m_bigfile == nullptr)
        {
            m_bigfile = new BigFile(name);
        }
        cout<<"调用前..."<<endl;
        m_bigfile->showFile();
        cout<<"调用后..."<<endl;
    }
private:
    BigFile *m_bigfile;

};
  1. 客户端调用
    在这里插入图片描述
#include "bigfileproxy.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    File * bigfile = new BigFileProxy("BigImage.png");
    bigfile->showFile();
    delete  bigfile;

    return a.exec();
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值