Design/proxy/Proxy.hpp

91 lines
1.9 KiB
C++
Raw Permalink Normal View History

2024-10-28 14:07:29 +08:00
/*
* @Description:
* @version:
* @Author:
* @Date: 2023-10-13 09:49:13
* @LastEditors:
* @LastEditTime: 2023-10-13 11:25:02
*/
#include <iostream>
// 接口虚类
class Subject {
public:
virtual void method() = 0;
virtual void print() = 0;
};
// 接口虚类2
class Subject2 {
public:
virtual void method2() = 0;
virtual void print2() = 0;
};
// 业务实现类
class RealSubject : public Subject {
public:
void method() { print(); }
void print() { std::cout << "real method" << std::endl; }
};
// 业务实现类2
class RealSubject2 : public Subject2 {
public:
void method2() { print2(); }
void print2() { std::cout << "real2 method" << std::endl; }
};
// Log类
class Log {
public:
Log() {}
std::string getTime() {
time_t t = time(NULL);
char ch[64] = {0};
// 年-月-日 时:分:秒
strftime(ch, sizeof(ch) - 1, "%Y-%m-%d %H:%M:%S", localtime(&t));
return ch;
}
};
// 代理类
class StaticProxy : public Subject {
public:
StaticProxy() {
subject = new RealSubject();
log = new Log();
}
~StaticProxy() {
delete subject;
delete log;
}
void method() {
std::cout << log->getTime() << ": "
<< "static proxy start" << std::endl;
subject->method();
std::cout << log->getTime() << ": "
<< "static proxy end" << std::endl;
}
void print() {}
private:
RealSubject* subject;
Log* log;
};
template <class T>
class DynamicProxy : public T {
public:
DynamicProxy(std::function<void()> func) : func(func), log(new Log) {}
~DynamicProxy() { delete log; }
void extend() {
std::cout << log->getTime() << ": "
<< "dynamic proxy start" << std::endl;
func();
std::cout << log->getTime() << ": "
<< "dynamic proxy end" << std::endl;
}
void method() { extend(); }
void method2() { extend(); }
private:
std::function<void()> func;
Log* log;
};