一、代理模式是什么?
代理模式是一种结构型的软件设计模式,在不改变原代码前提下,提供一个代理,以控制对原对象的访问。
代理模式的优点:
- 职责清晰。真实对象专注于自身业务逻辑,不用考虑其他非本职内容,交给代理完成。
- 高拓展性。真实对象的改变不影响代理。
- 解耦。将客户端与真实对象分离,降低系统耦合度。
- 提高性能。虚拟代理可以减少系统资源的消耗。
- 高安全性和稳定性。代理能很好地控制访问,提高程序安全。
代理模式的缺点:
- 增加系统复杂度。代理的职责往往较冗杂。
- 请求速度降低。客户端与真实对象中加入代理,一定程度上会降低整个系统流程的运行效率。
二、代理模式
2.1 结构图
客户端即Main主函数,本文示例中代理添加了额外功能-充值,因此客户端直接调用代理。
2.2 代码示例
场景描述:游戏往往有自己的代理商,想要玩魔兽,需要和其代理进行沟通,在进行充值后,正常游戏。
//Game.h /****************************************************/ #pragma once #include <iostream> using namespace std; #include <iostream> using namespace std; // 抽象游戏类 class Game { public: // 游戏加载 virtual void load() = 0; // 游戏退出 virtual void exit() = 0; }; // 真实游戏类-魔兽世界 class WOW : public Game { public: // 游戏加载 virtual void load() { cout << "魔兽世界加载。" << endl; } // 游戏退出 virtual void exit() { cout << "魔兽世界退出。" << endl; } }; // 代理类-魔兽代理 class ProxyWOW : public Game { public: // 构造函数 ProxyWOW() { m_wow = new WOW(); } // 析构函数 virtual ~ProxyWOW() { if (m_wow != nullptr) { delete m_wow; m_wow = nullptr; } } // 充值时间 void recharge(int money) { m_time += money / 100; cout << "充值:" << money << endl; cout << "获得时长:" << m_time << endl; } // 游戏加载 virtual void load() { cout << "代理启动。" << endl; if (m_time > 0) { m_wow->load(); cout << "游戏时长1小时。" << endl; m_time -= 1; cout << "剩余时长:" << m_time << endl; flag = true; } else { cout << "剩余游戏时长不足,请充值。" << endl; flag = false; } } // 游戏退出 virtual void exit() { if (flag) { m_wow->exit(); flag = false; } cout << "代理关闭。" << endl; } private: bool flag = false; int m_time = 0; WOW* m_wow; };
//main.cpp /****************************************************/ #include <iostream> #include <string> #include "Subject.h" using namespace std; int main() { // 玩魔兽 ProxyWOW* proxy = new ProxyWOW(); // 加载 proxy->load(); // 充值 proxy->recharge(1000); // 加载 proxy->load(); // 退出 proxy->exit(); // 清理内存 delete proxy; proxy = nullptr; return 0; }
程序结果如下。
本文提供的示例是游戏方面的,玩大型网络游戏往往都要通过代理的平台,所以我模拟了一个简易的充值和游戏流程。代理在生活中随处可见,各种中介服务就是代理的一种;在网络应用中代理也很常见,如服务器代理等等。
三、总结
我尽可能用较通俗的话语和直观的代码例程,来表述我对代理模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解代理模式。
如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!