代理模式

在这里插入图片描述

1、场景举例

,
在这里插入图片描述

2、主要应用场景

适用于客户端和服务端存在大量交互的场景,使用代理模式,可以解耦这种交互。

3、类图

在这里插入图片描述

4、用C实现代理模式

角色定义

1、代理端
2、实际业务端
3、具体操作

案例描述

使用代理模式,实现不同网络协议的代理发送

案例实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct PC_CLIENT{
    void (*request)();
}Pc_Client;

typedef struct PROXY{
    Pc_Client *pc_client;
}Proxy;

void http_request()
{
    printf("http request!!!\n");
    return;
}

void ftp_request()
{
    printf("ftp request!!!\n");
    return;
}

void ntp_request()
{
    printf("ntp request!!!\n");
    return;
}

struct PROXY *apply_proxy(void)
{
    struct PROXY *tmp_proxy = NULL;
    struct PC_CLIENT *tmp_pc_client = NULL;
    
    tmp_proxy = (struct PROXY *)malloc(sizeof(struct PROXY));
    if (tmp_proxy == NULL){
        return NULL;
    }

    tmp_pc_client = (struct PC_CLIENT *)malloc(sizeof(struct PC_CLIENT));
    if (tmp_pc_client == NULL){
        return NULL;
    }    
    
    tmp_proxy->pc_client = tmp_pc_client;
    tmp_pc_client->request = NULL;
    
    return tmp_proxy;
}

int main()
{
    struct PROXY *proxy = NULL;
    
    proxy = apply_proxy();
    if(proxy == NULL){
        return 1;
    }
    proxy->pc_client->request = http_request;
    proxy->pc_client->request();
    proxy->pc_client->request = ftp_request;
    proxy->pc_client->request();    
    proxy->pc_client->request = ntp_request;
    proxy->pc_client->request();    
    
    if(proxy == NULL){
        free(proxy);
        proxy == NULL;
    }
    
    return 0;
}

5、用C++实现代理模式

角色定义

1、共用接口
2、代理端
3、代理实体

案例描述

使用代理模式打印hello world

案例实现

#include <iostream>

using namespace std;

class SUBJECT
{
public:
    virtual void Request() = 0;
};

class REAL_SUBJECT:public SUBJECT
{
public:
    void Request()
    {
        cout << "hello my world!!!" << endl;
    }
};

class PROXY_SUBJECT:public SUBJECT
{
public:    
    PROXY_SUBJECT():real_subject(NULL){};
    ~PROXY_SUBJECT()
    {
        if (real_subject){
            delete real_subject;
            real_subject = NULL;
        }
    }
    void Request()
    {
        if (real_subject == NULL){
            real_subject = new REAL_SUBJECT();
        }
        real_subject->Request();
    }
    
private:
    REAL_SUBJECT *real_subject;
};

int main()
{
    SUBJECT *subject = new PROXY_SUBJECT();
    subject->Request();
    
    if (subject){
        delete subject;
        subject = NULL;
    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值