长生栈 长生栈
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Living Team

编程技术分享
首页
  • 编程语言

    • C语言
    • C++
    • Java
    • Python
  • 数据结构和算法

    • 全排列算法实现
    • 动态规划算法
  • CMake
  • gitlab 安装和配置
  • docker快速搭建wordpress
  • electron+react开发和部署
  • Electron-创建你的应用程序
  • ImgUI编译环境
  • 搭建图集网站
  • 使用PlantUml画时序图
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 创建型模式

  • 结构型模式

    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 组合模式(Composite Pattern)
    • 装饰器模式(Decorator Pattern)
    • 外观模式(Facade Pattern)
    • 享元模式(Flyweight Pattern)
    • 代理模式(Proxy Pattern)
      • 概念
      • 思想
      • 角色
      • 优点
      • 缺点
      • 类图
      • 示例代码
  • 行为型模式

  • 设计模式
  • 结构型模式
DC Wang
2023-05-28
目录

代理模式(Proxy Pattern)

# 代理模式(Proxy Pattern)

# 概念

代理模式(Proxy Pattern)是一种结构型设计模式,它提供了一个代理对象,充当了客户端和实际对象之间的中介。代理模式允许通过代理对象控制对实际对象的访问,并在访问时添加额外的功能。

# 思想

代理模式的核心思想是在访问对象之前和之后进行一些额外的操作,而不需要直接访问实际对象。代理模式可以用于实现延迟加载、权限控制、缓存等功能。

# 角色

  1. Client(客户端):客户端通过代理对象来访问实际对象。
  2. Subject(抽象主题):定义了实际对象和代理对象的共同接口。
  3. RealSubject(实际主题):实现了抽象主题接口,是客户端真正需要访问的对象。
  4. Proxy(代理):实现了抽象主题接口,并持有一个实际主题对象的引用。代理对象在访问实际主题之前或之后可以执行一些额外的操作。

# 优点

  • 可以实现对客户端透明,客户端无需知道实际对象的存在。
  • 可以控制对实际对象的访问,提供额外的功能,如权限验证、缓存等。
  • 可以实现延迟加载,只有在真正需要时才创建实际对象。
  • 可以对实际对象进行保护,防止非法访问。

# 缺点

  • 增加了系统复杂性,引入了额外的类和接口。
  • 可能会导致请求的处理速度变慢,因为需要通过代理对象来访问实际对象。

# 类图

以下是代理模式的类图,使用PlantUML绘制:

@startuml

class Client {
    +request()
}

interface Subject {
    +request()
}

class RealSubject {
    +request()
}

class Proxy {
    -realSubject: RealSubject
    +request()
}

note left of Client::request
    proxy.request();
@enduml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 示例代码

下面是一个使用C++实现的简单代理模式示例:

#include <iostream>

// Subject(抽象主题)
class Subject {
public:
    virtual void request() = 0;
};

// RealSubject(实际主题)
class RealSubject : public Subject {
public:
    void request() override {
        std::cout << "RealSubject: Handling request." << std::endl;
    }
};

// Proxy(代理)
class Proxy : public Subject {
private:
    RealSubject* realSubject;

public:
    Proxy() {
        realSubject = new RealSubject();
    }

    ~Proxy() {
        delete realSubject;
    }

    void request() override {
        std::cout << "Proxy: Pre-processing request." << std::endl;
        realSubject->request();
        std::cout << "Proxy: Post-processing request." << std::endl;
    }
};

int main() {
    Subject* proxy = new Proxy();
    proxy->request();
    delete proxy;

    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

代码运行结果:

Proxy: Pre-processing request.
RealSubject: Handling request.
Proxy: Post-processing request.
1
2
3

示例代码中,客户端(Client)通过代理对象(Proxy)来访问实际对象(RealSubject)。在代理对象的request()方法中,会在访问实际对象之前进行预处理,输出"Proxy: Pre-processing request.";然后调用实际对象的request()方法,输出"RealSubject: Handling request.";最后在访问实际对象之后进行后处理,输出"Proxy: Post-processing request."。这样,通过代理对象,实现了在访问实际对象前后添加额外功能的目的。

编辑 (opens new window)
#设计模式#结构型模式
上次更新: 2023/06/09, 13:17:31
享元模式(Flyweight Pattern)
责任链模式(Chain of Responsibility Pattern)

← 享元模式(Flyweight Pattern) 责任链模式(Chain of Responsibility Pattern)→

最近更新
01
ESP32-网络摄像头方案
06-14
02
ESP32-PWM驱动SG90舵机
06-14
03
ESP32-实时操作系统freertos
06-14
更多文章>
Theme by Vdoing | Copyright © 2019-2025 DC Wang All right reserved | 辽公网安备 21021102001125号 | 吉ICP备20001966号-2
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式