惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 鬼谷子com

2026年国内主流AI Coding Plan套餐全对比|开发者避坑指南 图解 | 你管这破玩意儿叫TCP?(转载) C++ static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符) Qt内部的d指针和q指针手把手教你实现 C++中虚函数、虚继承内存模型 c++11新特性实战(二):智能指针 windows下使用mingw和msvc静态编译Qt5.15.xx Qt moc元对象编译器的原理和场景(反射) c++结构体内存对齐 c++11新特性实战 (一):多线程操作 抽象工厂模式(c++实现) 迭代器模式(c++实现) 中介者模式(c++实现) 享元模式(c++实现) 状态模式(c++实现) - 鬼谷子com 建造者模式(c++实现) 职责链模式(c++实现) 命令模式(c++实现) 模板方法模式(c++实现)
代理模式(c++实现)
鬼谷子com · 2020-07-16 · via 博客园 - 鬼谷子com

代理模式

模式定义

代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。

模式动机

  • 远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。
  • 虚拟代理,是根据需要创建开销很大的对象。通过他来存放实例化需要很长时间的真实对象。
  • 安全代理,用来控制真实对象访问时的权限。
  • 智能指引,是指当调用真实的对象时,代理处理另外一些事。

UML类图

源码实现

  • givegift.h
class GiveGift
{
public:
    GiveGift();
    virtual ~GiveGift();
    virtual void GiveFlow() = 0;
    virtual void GiveChocolate() = 0;
    virtual void GiveDolls() = 0;
};
  • proxy.h
#include "givegift.h"

class ConcretePeople;
class ConcreteGirl;

class Proxy : public GiveGift
{
public:
    Proxy(ConcreteGirl* girl);
    void GiveFlow() override;
    void GiveDolls() override;
    void GiveChocolate() override;

private:
    ConcretePeople*     m_People;
};

  • proxy.cpp
#include "proxy.h"
#include "concretegirl.h"
#include "concretepeople.h"

Proxy::Proxy(ConcreteGirl* girl)
{
    m_People = new ConcretePeople("小明");
    m_People->ChasingGirls(girl);
}

void Proxy::GiveFlow()
{
    if(m_People)
        m_People->GiveFlow();
}

void Proxy::GiveDolls()
{
    if(m_People)
        m_People->GiveDolls();
}

void Proxy::GiveChocolate()
{
    if(m_People)
        m_People->GiveChocolate();
}
  • concretepeople.h
#include <string>
#include "givegift.h"
#include "concretegirl.h"

class ConcretePeople : public GiveGift
{
public:
    ConcretePeople(std::string name);
    void GiveFlow() override;
    void GiveDolls() override;
    void GiveChocolate() override;

    void ChasingGirls(ConcreteGirl* girl);
private:
    std::string     m_Name;
    ConcreteGirl*       m_Girl;
};
  • concretepeople.cpp
#include <iostream>
#include "concretepeople.h"

ConcretePeople::ConcretePeople(std::string name)
    :m_Name(name)
{

}

void ConcretePeople::GiveFlow()
{
    if(m_Girl)
        std::cout << m_Girl->Name() << " 这是送你的花" << std::endl;
}

void ConcretePeople::GiveDolls()
{
    if(m_Girl)
        std::cout << m_Girl->Name() << " 这是送你的洋娃娃" << std::endl;
}

void ConcretePeople::GiveChocolate()
{
    if(m_Girl)
        std::cout << m_Girl->Name() << " 这是送你的巧克力" << std::endl;
}

void ConcretePeople::ChasingGirls(ConcreteGirl *girl)
{
    m_Girl = girl;
}
  • concreteGirl.h
#include <string>

class ConcreteGirl
{
public:
    ConcreteGirl(std::string name);
    std::string Name();
private:
    std::string     m_Name;
};
  • main.cpp
#include <iostream>
#include <memory>
#include "proxy.h"
#include "concretegirl.h"
using namespace std;

int main()
{
    std::shared_ptr<ConcreteGirl> girl = std::make_shared<ConcreteGirl>("赫敏");
    Proxy* proxy = new Proxy(girl.get());
    proxy->GiveFlow();
    proxy->GiveDolls();
    proxy->GiveChocolate();

    return 0;
}

  • 运行结果

赫敏 这是送你的花

赫敏 这是送你的洋娃娃

赫敏 这是送你的巧克力

优点

模式的优点

  • 从模式的动机我们能看出来几个好处:
    • 可以隐藏需要代理的对象
    • 控制对象的访问权限
    • 可以通过代理对象获取自己需要的对象

缺点

模式的缺点