日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

设计模式 之美 -- 代理模式

發(fā)布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式 之美 -- 代理模式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

        • 1. 解決問題
        • 2. 應用場景
          • 1. 業(yè)務系統(tǒng)的非功能性開發(fā)
          • 2. 代理模式在RPC、緩存中的應用
        • 3. 實現(xiàn)
          • C++實現(xiàn)
          • C語言實現(xiàn)

1. 解決問題

客戶端和目標對象之間需要進行交互,此時客戶端類和目標對象類相關操作之間的邏輯如果交合在一起,會導致客戶端和目標對象模塊耦合度升高,后期擴展客戶端的功能時,則需要修改兩者的源代碼。

這樣的架構設計在系統(tǒng)更加龐大(網(wǎng)絡通信鏈路龐雜,功能增刪頻繁)的場景下,維護成本極高。

所以,推出代理模式,在客戶端和目標對象之間增加代理類,客戶端僅需要調(diào)用代理類相關的接口,即可完成對目標對象的操作;當客戶端調(diào)用新的對象時,僅需要擴展代理類的接口即可。

2. 應用場景

1. 業(yè)務系統(tǒng)的非功能性開發(fā)

監(jiān)控、統(tǒng)計、鑒權、事務、冪等、日志 這一些附加功能

通過代理模式,將其與業(yè)務功能解耦,在代理類中同一處理,程序員僅需關注業(yè)務方面的開發(fā),附加功能的調(diào)用僅需通過代理類提供的封裝好的接口即可。

如:Spring AOP切面 即為代理模式

2. 代理模式在RPC、緩存中的應用

通過遠程代理,將網(wǎng)絡通信、數(shù)據(jù)編解碼等細節(jié)隱藏起來。客戶端使用RPC時就像使用本地函數(shù)一樣,無需了解和服務器的交互細節(jié)。

RPC服務的開發(fā)者也只需開發(fā)業(yè)務邏輯,就像開發(fā)本地函數(shù)一樣,不需要關注跟客戶端的交互細節(jié)。

代理模式在緩存中應用,對于需求中開發(fā)一個接口請求的緩存功能,支持緩存、支持實時查詢兩個接口。此時,隨著需求的增加,每個需要都需要增加以上兩個接口,這顯著增加了開發(fā)成本,且會讓代碼臃腫。

此時增加代理模式,使用動態(tài)代理的方式維護 緩存功能的兩個接口:支持緩存和支持查詢。

3. 實現(xiàn)

C++實現(xiàn)

實現(xiàn)功能:

出版社:被代理對象,要賣書

淘寶、當當網(wǎng):代理對象

客戶端通過當當網(wǎng)進行買書。

#include <iostream>using namespace std;/*
subject(抽象主題角色)真實主題與代理主題的共同接口。RealSubject(真實主題角色):定義了代理角色所代表的真實對象。 Proxy(代理主題角色):含有對真實主題角色的引用,代理角色通常在將客戶端調(diào)用傳遞給真是主題對象之前或者之后執(zhí)行某些操作,而不是單純返回真實的對象。提示:a中包含b類;a、b類實現(xiàn)協(xié)議類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語言實現(xiàn)

實現(xiàn)功能:

實現(xiàn)不同網(wǎng)絡協(xié)議的代理發(fā)送

實際業(yè)務端調(diào)用操作時才知道具體調(diào)用的網(wǎng)絡協(xié)議(動態(tài)代理)

#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!!!

總結

以上是生活随笔為你收集整理的设计模式 之美 -- 代理模式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。