cpp: Proxy Pattern

25 篇文章 0 订阅
/*****************************************************************//**
 * \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
{
        vector<string> gFileItemList;
    /// <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购物网站!
*************
从文件中读取了如下数据------------:
1-----1--line-------------
2-----2--line-------------
3-----3--line-------------
从缓存中读取了如下数据------------:
1-----1--line-------------
2-----2--line-------------
3-----3--line-------------
从缓存中读取了如下数据------------:
1-----1--line-------------
2-----2--line-------------
3-----3--line-------------
请按任意键继续. . .

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值