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;
}