前文回顾
单例模式(一)
单例模式(二)
观察者模式
简单工厂模式
工厂方法模式(一)
工厂方法模式(二)
抽象工厂模式(一)
抽象工厂模式(二)
原型模式
外观模式
中介者模式
前言
代理模式即用一个类对象全权代表另外一个类对象,把真正干活的对象隐藏在幕后。代理对象和被代理的对象都是继承自同一基类,对外表现为相同的接口。
代理模式的本质是对被代理对象的一个再包装,可以滞后一个方法的调用操作,从而可以在调用前或者调用后增加一些控制方法,而对客户端来说和使用实际对象并没有区别。
实现举例
- 场景描述
假设一个场景:界面中有一些文件的展示功能,但某些文件很的时候会有很长时间的构造过程,则会阻塞程序的运行,此时可以使用代理模式,直到真正使用文件时再真的进行构造。 - 抽象基类
#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;
};
- 派生类
在派生类的构造函数中模拟一个耗时的操作。
#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;
}
};
- 代理类
#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;
};
- 客户端调用
#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();
}