cpp: Proxy Pattern

发布时间 2023-05-31 23:35:00作者: ®Geovin Du Dream Park™

 

/*****************************************************************//**
 * \file   GoldWebSite.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once

#ifndef GOLDWEBSITE_H 
#define GOLDWEBSITE_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <map>



using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GoldWebSite
	{

	public:
		/// <summary>
		/// 执行访问网站的动作,子类中重新实现
		/// </summary>
		virtual void visit() = 0; 

		/// <summary>
		/// 做父类时析构函数应该为虚函数
		/// </summary>
		virtual ~GoldWebSite() {} 

	};

}

#endif



/*****************************************************************//**
 * \file   GoldWebSitShopping.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDWEBSITESHOPPING_H 
#define GOLDWEBSITESHOPPING_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <map>
#include "GoldWebSite.h"


using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 某购物网站
	/// </summary>
	class GoldWebSitShopping:public GoldWebSite
	{
	public:

		/// <summary>
		/// 
		/// </summary>
		virtual void visit()
		{
			//......访问该购物网站,可能涉及到复杂的网络通信
			cout << "访问Shopping购物网站!" << endl;
		}


	};
}
#endif


/*****************************************************************//**
 * \file   GoldWebSiteVideo.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDWEBSITEVIDEO_H 
#define GOLDWEBSITEVIDEO_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <map>
#include "GoldWebSite.h"


using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 某视频网站
	/// </summary>
	class GoldWebSiteVideo :public GoldWebSite
	{
	public:

		/// <summary>
		/// 
		/// </summary>
		virtual void visit()
		{
			//......访问该视频网站,可能涉及到复杂的网络通信
			cout << "访问Video视频网站!" << endl;
		}
	};
}
#endif


/*****************************************************************//**
 * \file   GoldWebSiteProxy.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDWEBSITEPROXY_H 
#define GOLDWEBSITEPROXY_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <map>
#include "GoldWebSite.h"


using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 网站代理类
	/// </summary>
	class GoldWebSiteProxy :public GoldWebSite
	{

	public:
		/// <summary>
		/// 构造函数,引入的目的是传递进来要访问的具体网站
		/// </summary>
		/// <param name="pwebaddr"></param>
		GoldWebSiteProxy(GoldWebSite* pwebaddr) :mpGoldWebSite(pwebaddr) {}
	public:
		/// <summary>
		/// 
		/// </summary>
		virtual void visit()
		{
			//在这里进行访问的合法性检查、日志记录或者流量限制......
			mpGoldWebSite->visit();
			//在这里可以进行针对返回数据的过滤......
		}
	private:
		/// <summary>
		/// 代表要访问的具体网站
		/// </summary>
		GoldWebSite* mpGoldWebSite;

	};
}
#endif


/*****************************************************************//**
 * \file   GoldWebSiteShoppingProxy.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GOLDWEBSITESHOPPINGPROXY_H 
#define GOLDWEBSITESHOPPINGPROXY_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>
#include <map>
#include "GoldWebSite.h"
#include "GoldWebSitShopping.h"

#include "GoldWebSiteProxy.h"

using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GoldWebSiteShoppingProxy
	{
	public:

		/// <summary>
		/// 
		/// </summary>
		virtual void visit()
		{
			//在这里进行访问的合法性检查、日志记录或者流量限制......
			GoldWebSitShopping* pWebSite= new GoldWebSitShopping();
			pWebSite->visit();
			//在这里可以进行针对返回数据的过滤......

			//释放资源
			delete pWebSite;
		}


	};

}
#endif

/*****************************************************************//**
 * \file   GeovinDu.h
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#pragma once
#ifndef GEOVINDU_H 
#define GEOVINDU_H 

#include<cstring>
#include<stdbool.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
#include<cmath>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
#include <array>
#include <functional>
#include <list>
#include <string>
#include <string.h>


#include "GoldWebSite.h"
#include "GoldWebSitShopping.h"
#include "GoldWebSiteVideo.h"
#include "GoldWebSiteShoppingProxy.h"
#include "GoldWebSiteProxy.h"

#include "GoldReadInfo.h"
#include "ReadInfoFromFile.h"
#include "ReadInfoProxy.h"


using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 
	/// </summary>
	class GeovinDu
	{

	private:


	public:

		/// <summary>
		/// 
		/// </summary>
		void displaySimple();

		/// <summary>
		/// 
		/// </summary>
		void displayFileSimple();


	};
}
#endif

/*****************************************************************//**
 * \file   GeovinDu.cpp
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
#include "GeovinDu.h"




using namespace std;




namespace DuJewelryProxyPattern
{

	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displaySimple()
	{




		DuJewelryProxyPattern::GoldWebSite* wba1 = new DuJewelryProxyPattern::GoldWebSitShopping();
		wba1->visit(); //访问该购物网站

		DuJewelryProxyPattern::GoldWebSite* wba2 = new DuJewelryProxyPattern::GoldWebSiteVideo();
		wba2->visit(); //访问该视频网站

	

		DuJewelryProxyPattern::GoldWebSite* wba3 = new DuJewelryProxyPattern::GoldWebSitShopping();
		DuJewelryProxyPattern::GoldWebSite* wba4 = new DuJewelryProxyPattern::GoldWebSiteVideo();

		DuJewelryProxyPattern::GoldWebSiteProxy* wbaproxy1 = new DuJewelryProxyPattern::GoldWebSiteProxy(wba3);
		wbaproxy1->visit(); //通过代理去访问WebAddr_Shopping购物网站

		DuJewelryProxyPattern::GoldWebSiteProxy* wbaproxy2 = new DuJewelryProxyPattern::GoldWebSiteProxy(wba4);
		wbaproxy2->visit(); //通过代理去访问WebAddr_Video视频网站




		DuJewelryProxyPattern::GoldWebSiteShoppingProxy* wbasproxy = new DuJewelryProxyPattern::GoldWebSiteShoppingProxy();
		wbasproxy->visit(); //访问的实际是某购物网站


		//资源释放
		delete wba1;
		delete wba2;
		//资源释放
		delete wba3;
		delete wba4;
		delete wbaproxy1;
		delete wbaproxy2;
		//资源释放
		delete wbasproxy;
	}
	/// <summary>
	/// 
	/// </summary>
	void GeovinDu::displayFileSimple()
	{
		//DuJewelryProxyPattern::GoldReadInfo* preadinfoproxy = new DuJewelryProxyPattern::ReadInfoProxy();
		//preadinfoproxy->read(); //第一次调用read是借助代理使用真实的主题到文件中拿数据
		//preadinfoproxy->read(); //后续调用read都是直接从缓存中拿数据
		//preadinfoproxy->read(); //从缓存中拿数据

		////资源释放
		//delete preadinfoproxy;


	}


}

  

调用:

/*****************************************************************//**
 * \file   ConsoleDuProxyPattern.cpp
 * \brief  代理模式 ProxyPattern  C++ 14
 * 2023年5月31日 涂聚文 Geovin Du Visual Studio 2022 edit.
 * 
 * \author geovindu
 * \date   May 2023
 *********************************************************************/
// ConsoleDuProxyPattern.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _UNICODE

#include <iostream>
#include "GeovinDu.h"


using namespace std;
using namespace DuJewelryProxyPattern;


int main()
{
    std::cout << "Hello World!涂聚文 Geovin Du\n";

    GeovinDu geovin;
    geovin.displaySimple();
    cout << "*************" << endl;
    geovin.displayFileSimple();


    system("pause");
    return 0;


}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件

#define UNICODE

  

输出:

Hello World!涂聚文 Geovin Du
访问Shopping购物网站!
访问Video视频网站!
访问Shopping购物网站!
访问Video视频网站!
访问Shopping购物网站!
*************
请按任意键继续. . .