代理模式 弃

工作场景:让用户根据接口查询系统各资源占用率

  • 优化用户性能

传统代码:

传统代码
//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业务
    每次都需要进行判断是否由缓存

代理模式image

代理模式
#pragma once

#include "ServerInfo.h"

class ServerInfoGetterBase
{
public:
	virtual ServerInfo getinfo() = 0;
};

  • 创建一个继承自最原始基类的基类由个纯虚函数,给一个不需要缓存的类和一个需要缓存的类实现
posted @ 2023-09-24 13:08  游客0721  阅读(12)  评论(0)    收藏  举报