设计模式 之美 -- 代理模式
文章目錄
- 1. 解決問題
- 2. 應用場景
- 1. 業務系統的非功能性開發
- 2. 代理模式在RPC、緩存中的應用
- 3. 實現
- C++實現
- C語言實現
1. 解決問題
客戶端和目標對象之間需要進行交互,此時客戶端類和目標對象類相關操作之間的邏輯如果交合在一起,會導致客戶端和目標對象模塊耦合度升高,后期擴展客戶端的功能時,則需要修改兩者的源代碼。
這樣的架構設計在系統更加龐大(網絡通信鏈路龐雜,功能增刪頻繁)的場景下,維護成本極高。
所以,推出代理模式,在客戶端和目標對象之間增加代理類,客戶端僅需要調用代理類相關的接口,即可完成對目標對象的操作;當客戶端調用新的對象時,僅需要擴展代理類的接口即可。
2. 應用場景
1. 業務系統的非功能性開發
監控、統計、鑒權、事務、冪等、日志 這一些附加功能
通過代理模式,將其與業務功能解耦,在代理類中同一處理,程序員僅需關注業務方面的開發,附加功能的調用僅需通過代理類提供的封裝好的接口即可。
如:Spring AOP切面 即為代理模式
2. 代理模式在RPC、緩存中的應用
通過遠程代理,將網絡通信、數據編解碼等細節隱藏起來??蛻舳耸褂肦PC時就像使用本地函數一樣,無需了解和服務器的交互細節。
RPC服務的開發者也只需開發業務邏輯,就像開發本地函數一樣,不需要關注跟客戶端的交互細節。
代理模式在緩存中應用,對于需求中開發一個接口請求的緩存功能,支持緩存、支持實時查詢兩個接口。此時,隨著需求的增加,每個需要都需要增加以上兩個接口,這顯著增加了開發成本,且會讓代碼臃腫。
此時增加代理模式,使用動態代理的方式維護 緩存功能的兩個接口:支持緩存和支持查詢。
3. 實現
C++實現
實現功能:
出版社:被代理對象,要賣書
淘寶、當當網:代理對象
客戶端通過當當網進行買書。
#include <iostream>using namespace std;/*
subject(抽象主題角色)真實主題與代理主題的共同接口。RealSubject(真實主題角色):定義了代理角色所代表的真實對象。 Proxy(代理主題角色):含有對真實主題角色的引用,代理角色通常在將客戶端調用傳遞給真是主題對象之前或者之后執行某些操作,而不是單純返回真實的對象。提示:a中包含b類;a、b類實現協議類protocol
*/class Subject
{
public:virtual void SaleBook() = 0;
protected:
private:
};class RealSubject : public Subject
{
public:virtual void SaleBook(){cout << "賣實體書\n";}
protected:
private:
};class ProxyTaoBao : public Subject
{
public:virtual void SaleBook(){Double11();RealSubject rs;rs.SaleBook();Double11();}void Double11(){cout << "Double11 打折,半價" << endl;}
protected:
private:
};class ProxyDangDang : public Subject
{
public:ProxyDangDang():m_s(NULL){}void SetRealSubject(RealSubject *rs){m_s = rs;}virtual void SaleBook(){Double11();SetRealSubject(new RealSubject());m_s->SaleBook();}void Double11(){cout << "Double11 打折,半價" << endl;}
protected:
private:RealSubject *m_s;
};int main()
{cout << "當當代理:" << endl;ProxyDangDang *pdd = new ProxyDangDang;pdd->SaleBook();delete pdd;cout << "淘寶代理:" << endl;ProxyTaoBao *ptb = new ProxyTaoBao;ptb->SaleBook();delete ptb; return 0;
}
輸出如下:
當當代理:
Double11 打折,半價
賣實體書
淘寶代理:
Double11 打折,半價
賣實體書
Double11 打折,半價
C語言實現
實現功能:
實現不同網絡協議的代理發送
實際業務端調用操作時才知道具體調用的網絡協議(動態代理)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>typedef struct CLIENT{void (*request)();
}PcClient;typedef struct PROXY{PcClient *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;
}Proxy *apply_proxy(void){struct PROXY *tmp_proxy = NULL;struct CLIENT *tmp_client = NULL;tmp_proxy = (Proxy*)malloc(sizeof(Proxy));if(tmp_proxy == NULL){return NULL;}tmp_client = (PcClient*)malloc(sizeof(PcClient));if(tmp_client == NULL){return NULL;}tmp_proxy -> client = tmp_client;tmp_client -> request = NULL;return tmp_proxy;
}int main()
{Proxy *proxy = NULL;proxy = apply_proxy();if(proxy == NULL) {return -1;}proxy -> client -> request = http_request;proxy -> client -> request();proxy -> client -> request = ftp_request;proxy -> client -> request();proxy -> client -> request = ntp_request;proxy -> client -> request();if(NULL != proxy) {free(proxy);proxy = NULL;}return 0;
}
輸出如下:
http request!!!
ftp request!!!
ntp request!!!
總結
以上是生活随笔為你收集整理的设计模式 之美 -- 代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《春雪》第三句是什么
- 下一篇: 读书:个人成长 -- 即兴演讲