介紹
? ? ? ? 代理模式是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式是一種對象結(jié)構(gòu)型模式。
實現(xiàn)
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <unordered_map>
class Subject { // 抽象主題角色
public:
virtual void request() = 0;
};
class Proxy : public Subject { // 代理主題角色
public:
Proxy();
~Proxy();
void request() override;
void preRequest();
void postRequest();
private:
Subject *m_real;
};
class RealSubject : public Subject {
public:
void request() override;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
Proxy::Proxy() {
m_real = new RealSubject();
}
Proxy::~Proxy() {
if (m_real) {
delete m_real;
}
}
void Proxy::request() {
if (m_real) {
preRequest();
m_real->request();
postRequest();
}
}
void Proxy::preRequest() {
std::cout << "代理請求準備工作" << std::endl;
}
void Proxy::postRequest() {
std::cout << "代理結(jié)束收尾工作" << std::endl;
}
void RealSubject::request() {
std::cout << "被代理的請求" << std::endl;
}
main.cpp
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
Subject *proxy = new Proxy();
proxy->request();
delete proxy;
return 0;
}
總結(jié)
優(yōu)點
? ? ? ? 1.?代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度,滿足迪米特法則。
? ? ? ? 2.?客戶端可以針對抽象主題角色進行編程,增加和更換代理類無須修改源代碼,符合開閉原則,系統(tǒng)具有較好的靈活性和可擴展性。
? ? ? ? 3.?遠程代理為位于兩個不同地址空間對象的訪問提供了一種實現(xiàn)機制,可以將一些消耗資源較多的對象和操作移至性能更好的計算機上,提高系統(tǒng)的整體運行效率。
? ? ? ? 4.?虛擬代理通過一個消耗資源較少的對象來代表一個消耗資源較多的對象,可以在一定程度上節(jié)省系統(tǒng)的運行開銷。
? ? ? ? 5.?保護代理可以控制對一個對象的訪問權限,為不同用戶提供不同級別的使用權限。
缺點
? ? ? ? 1.?由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢,例如保護代理。
? ? ? ? 2.?實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復雜,例如遠程代理。
適用場景
? ? ? ? 1.?當客戶端對象需要訪問遠程主機中的對象時,可以使用遠程代理。
? ? ? ? 2.?當需要用一個消耗資源較少的對象來代表一個消耗資源較多的對象,從而降低系統(tǒng)開銷、縮短運行時間時,可以使用虛擬代理。例如一個對象需要很長時間才能完成加載時。
? ? ? ? 3.?當需要控制對一個對象的訪問,為不同用戶提供不同級別的訪問權限時,可以使用保護代理。
? ? ? ? 4.?當需要為某一個被頻繁訪問的操作結(jié)果提供一個臨時存儲空間,以供多個客戶端共享訪問這些結(jié)果時,可以使用緩沖代理。通過緩沖代理,系統(tǒng)無須在客戶端每次訪問時都重新執(zhí)行操作,只需直接從臨時緩沖區(qū)獲取操作結(jié)果即可。
? ? ? ? 5.?當需要為一個對象的訪問(引用)提供一些額外的操作時,可以使用智能引用代理。
練習
myclass.h
//
// Created by yuwp on 2024/1/12.
//
#ifndef DESIGNPATTERNS_MYCLASS_H
#define DESIGNPATTERNS_MYCLASS_H
#include <iostream>
#include <unordered_map>
#include <atomic>
class Subject { // 抽象主題角色
public:
virtual void displayUrl(const std::string &url) = 0;
virtual void displayPic(const std::string &pic) = 0;
};
class Proxy : public Subject { // 代理主題角色
public:
Proxy();
~Proxy();
void displayUrl(const std::string &url) override;
void displayPic(const std::string &pic) override;
private:
Subject *m_real;
};
class RealSubject : public Subject {
public:
void displayUrl(const std::string &url) override;
void displayPic(const std::string &pic) override;
void download(const std::string &url);
bool isDownloadComplete();
private:
bool m_isDownloaded;
};
#endif //DESIGNPATTERNS_MYCLASS_H
myclass.cpp文章來源:http://www.zghlxwxcb.cn/news/detail-804122.html
//
// Created by yuwp on 2024/1/12.
//
#include "myclass.h"
#include <thread>
#include <unistd.h>
Proxy::Proxy() {
m_real = new RealSubject();
}
Proxy::~Proxy() {
if (m_real) {
delete m_real;
}
}
void Proxy::displayUrl(const std::string &url) {
if (m_real) {
new std::thread(&Subject::displayUrl, m_real, std::ref(url));
}
std::cout << "顯示圖片" << url << std::endl;
}
void Proxy::displayPic(const std::string &pic) {
if (m_real) {
m_real->displayPic(pic);
}
}
void RealSubject::download(const std::string &url) {
sleep(10);
std::cout << url << "下載完成" << std::endl;
m_isDownloaded = true;
}
bool RealSubject::isDownloadComplete() {
return m_isDownloaded;
}
void RealSubject::displayUrl(const std::string &url) {
download(url);
}
void RealSubject::displayPic(const std::string &pic) {
while (!m_isDownloaded) {
usleep(100000);
}
std::cout << "顯示圖片" << pic << std::endl;
}
main.cpp文章來源地址http://www.zghlxwxcb.cn/news/detail-804122.html
#include <iostream>
#include <mutex>
#include "myclass.h"
int main() {
Subject *proxy = new Proxy();
proxy->displayUrl("http://www.123.com/ab.jpg");
proxy->displayPic("ab.jpg");
delete proxy;
return 0;
}
到了這里,關于《設計模式的藝術》筆記 - 代理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!