代理模式 弃
工作场景:让用户根据接口查询系统各资源占用率
- 优化用户性能
传统代码:
传统代码
//main.cpp
#include <iostream>
#include "ServerInfoGetter.h"
#include <chrono>
#include <thread>
int main()
{
ServerInfoGetter getter;
ServerInfo info = getter.getInfo();
while (1) {
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
long long currentTime = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count();
if (currentTime - info.createTime >= 2000) {
info = getter.getInfo();
}
else {
// .....
}
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
return 0;
}
//ServerInfoGetter.h
#include "ServerInfoGetter.h"
ServerInfo ServerInfoGetter::getInfo()
{
ServerInfo info;
info.cpu = 0.45;
info.mem = 0.23;
return info;
}
//
#pragma onServerInfoGetter.hce
#include "ServerInfo.h"
class ServerInfoGetter
{
public:
ServerInfo getInfo();
};
//ServerInfo.h
#pragma once
class ServerInfo
{
public:
ServerInfo();
float cpu;
float mem;
long long createTime;
};
//ServerInfo.cpp
#include "ServerInfo.h"
#include <chrono>
#include <thread>
ServerInfo::ServerInfo()
{
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
createTime = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count();
}
ServerInfoGetter::getInfo()返回用户要查询的系统占用值- ServerInfo::ServerInfo封装了getinfo返回值的类型
ServerInfoGetter getter; ServerInfo info = getter.getInfo();在死循环里面每两秒发送信息给用户,
几个服务器同时调用接口,这个接口需要操作系统查询,效率很很差,问题是同一时刻或者短时间内内存和CPU的占用率是相同
long long createTime;给返回信息添加时间戳createTime()使用构造函数赋值while (1)在死循环的时候获取时间,看是否小于零,否则更新
缺点:每次都需要进行时间判断太复,由于要进行构造就缓存所以在程序开始就要记录时间而不是循环内,这样生命周期延长
拉跨版本
差劲1
#include "ServerInfoGetter.h"
#include <chrono>
ServerInfo ServerInfoGetter::cache;
ServerInfo ServerInfoGetter::getInfo()
{
if (cache.valid == false) {
ServerInfo info;
info.cpu = 0.45;
info.mem = 0.23;
info.valid = true;
cache = info;
return cache;
}
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
long long currentTime = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count();
if (currentTime - cache.createTime <= 2000) {
return cache;
}
else {
ServerInfo info;
info.cpu = 0.45;
info.mem = 0.23;
info.valid = true;
cache = info;
return info;
}
ServerInfo info;
info.cpu = 0.45;
info.mem = 0.23;
return info;
}
- 将main方法里的缓存结果继承到getinfo里的,每次getinfo的时候就判断是否过期,否则就重新获取赋值,再进行getinfo业务
每次都需要进行判断是否由缓存
代理模式
代理模式
#pragma once
#include "ServerInfo.h"
class ServerInfoGetterBase
{
public:
virtual ServerInfo getinfo() = 0;
};
- 创建一个继承自最原始基类的基类由个纯虚函数,给一个不需要缓存的类和一个需要缓存的类实现

浙公网安备 33010602011771号