創(chuàng)建網(wǎng)站要多少錢seo競價排名
文章目錄
- 定義
- UML圖
- 代理模式主要有以下幾種常見類型:
- 代理模式涉及的主要角色有:
- C++ 代碼示例
定義
代理模式(Proxy Pattern)屬于結構型設計模式,它為其他對象提供一種代理以控制對這個對象的訪問。
通過引入代理對象,代理模式可以在目標對象的基礎上,增加額外的功能,比如訪問控制、懶加載、緩存等,同時對外界隱藏目標對象的實現(xiàn)細節(jié),讓調(diào)用者感覺好像是在直接與目標對象進行交互。
UML圖
代理模式主要有以下幾種常見類型:
遠程代理(Remote Proxy):用于代表一個在不同地址空間(比如網(wǎng)絡上的不同服務器)的對象,使得客戶端可以像訪問本地對象一樣訪問遠程對象。
虛擬代理(Virtual Proxy):根據(jù)需要創(chuàng)建開銷較大的對象,比如在真正需要訪問對象時才去實例化它,常用于實現(xiàn)圖片懶加載等功能,在圖片要顯示時才加載圖片資源。
保護代理(Protection Proxy):控制對原始對象的訪問權限,根據(jù)不同的權限決定是否允許調(diào)用者執(zhí)行相應的操作。
代理模式涉及的主要角色有:
抽象主題(Subject):定義了真實主題和代理主題的共同接口,這樣客戶端在使用時可以以統(tǒng)一的方式與真實對象或代理對象進行交互。
真實主題(Real Subject):實現(xiàn)了抽象主題接口,是實際完成業(yè)務邏輯的對象,也就是被代理的對象。
代理(Proxy):同樣實現(xiàn)了抽象主題接口,內(nèi)部包含一個指向真實主題對象的指針,它可以在調(diào)用真實主題的方法前后添加額外的邏輯,來實現(xiàn)對真實主題的訪問控制等功能。
C++ 代碼示例
以下是一個簡單的代理模式示例,模擬一個簡單的圖像加載展示場景,這里使用虛擬代理的思路,先創(chuàng)建代理對象,在真正需要展示圖像(調(diào)用 display 方法)時才去加載并展示真實的圖像(這里只是簡單模擬加載邏輯)。
#include <iostream>
#include <string>// 抽象主題,定義圖像操作的接口
class Image
{
public:virtual void display() = 0;virtual ~Image() {}
};// 真實主題,代表實際的圖像,這里簡單模擬圖像有個文件名屬性及加載展示邏輯
class RealImage : public Image
{
private:std::string fileName;
public:RealImage(const std::string& name) : fileName(name) {loadFromDisk();}void display() override{std::cout << "Displaying image: " << fileName << std::endl;}
private:void loadFromDisk(){std::cout << "Loading image from disk: " << fileName << std::endl;}
};// 代理類,代表圖像的代理,在需要時才創(chuàng)建真實圖像對象并調(diào)用其方法
class ProxyImage : public Image
{
private:RealImage* realImage;std::string fileName;
public:ProxyImage(const std::string& name) : realImage(nullptr), fileName(name) {}void display() override{//在此,可以對被代理的對象的操作進行額外操作;//不允許顯示特定的圖片,異常處理,或者重新解碼顯示,加水印等等任何實際需求都可以在此添加if (!realImage){realImage = new RealImage(fileName);}realImage->display();}~ProxyImage() {delete realImage;}
};int main()
{// 創(chuàng)建代理對象,此時并沒有真正加載圖像Image* image = new ProxyImage("example.jpg");// 第一次調(diào)用 display,會觸發(fā)真實圖像的加載和展示image->display();// 第二次調(diào)用 display,因為已經(jīng)加載過了,直接展示,不會重復加載image->display();delete image;char t;std::cin>>t;return 0;
}
在上述代碼中:
Image 作為抽象主題,定義了 display 這個抽象方法,表示圖像展示的操作,客戶端只需要和這個接口進行交互。
RealImage 是真實主題,它實現(xiàn)了 Image 接口,內(nèi)部有圖像文件名屬性,并且在構造函數(shù)中會進行從磁盤加載圖像的模擬操作,在 display 方法中展示圖像。
ProxyImage 為代理類,它也實現(xiàn)了 Image 接口,內(nèi)部有一個指向 RealImage 的指針以及圖像文件名屬性。在 display 方法中,先判斷真實圖像是否已經(jīng)創(chuàng)建,如果沒有創(chuàng)建就實例化 RealImage,然后調(diào)用真實圖像的 display 方法來展示圖像。這樣就實現(xiàn)了在真正需要展示圖像時才去加載它的虛擬代理功能,并且在 main 函數(shù)里可以看到,多次調(diào)用展示方法時,后續(xù)調(diào)用不會重復加載圖像,提高了效率(在更復雜的場景下能體現(xiàn)出資源利用等方面的優(yōu)勢)。最后要記得釋放內(nèi)存,避免內(nèi)存泄漏。
仔細想一下,智能指針好像有點代理模式的意思。