亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++利用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理

 更新時(shí)間:2023年04月27日 10:21:53   作者:Thomas_Lbw  
今天給大家簡單介紹代理模式,一個(gè)很簡單的設(shè)計(jì)模式,旨在不改變原對象的情況下通過代理對象來控制對原對象的訪問。代理模式根據(jù)具體情況還可以分為遠(yuǎn)程代理、虛擬代理、保護(hù)代理等,下面來介紹一下

一、代理模式基礎(chǔ)介紹

1.1 基礎(chǔ)

C++代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,其主要目的是為其他對象提供一種代理,以控制對這些對象的訪問。代理對象可以充當(dāng)原始對象的包裝器,將請求轉(zhuǎn)發(fā)到原始對象,并且可以在轉(zhuǎn)發(fā)請求之前或之后執(zhí)行一些額外的操作。

代理模式通常用于以下幾種情況:

遠(yuǎn)程代理:用于在不同地址空間中的兩個(gè)對象之間通信,將請求發(fā)送到遠(yuǎn)程對象。

虛擬代理:用于延遲加載,即在需要時(shí)加載資源。

保護(hù)代理:用于控制對對象的訪問權(quán)限,例如,只有特定用戶才能訪問某個(gè)對象。

緩存代理:用于緩存對象的訪問結(jié)果,以避免重復(fù)執(zhí)行計(jì)算密集型操作。

在C++中實(shí)現(xiàn)代理模式可以使用抽象類和接口來定義代理和原始對象之間的通信協(xié)議,并使用具體類來實(shí)現(xiàn)它們。代理對象將請求轉(zhuǎn)發(fā)給原始對象,并可以在轉(zhuǎn)發(fā)請求之前或之后執(zhí)行一些額外的操作。

1.2 代碼示例

以下是一個(gè)簡單的C++代理模式的示例代碼:

#include <iostream>
using namespace std;
 
// 定義抽象類 Subject,代表原始對象和代理對象共同的接口
class Subject {
public:
    virtual void request() = 0;
};
 
// 定義具體類 RealSubject,實(shí)現(xiàn)原始對象的功能
class RealSubject : public Subject {
public:
    void request() override {
        cout << "RealSubject: Handling request." << endl;
    }
};
 
// 定義代理類 Proxy,實(shí)現(xiàn)代理對象的功能
class Proxy : public Subject {
private:
    RealSubject* real_subject_;
 
    void check_access() const {
        cout << "Proxy: Checking access prior to handling request." << endl;
    }
 
public:
    Proxy(RealSubject* real_subject) : real_subject_(real_subject) {}
 
    void request() override {
        check_access();
        real_subject_->request();
    }
};
 
int main() {
    RealSubject* real_subject = new RealSubject;
    Proxy* proxy = new Proxy(real_subject);
    proxy->request();
 
    delete proxy;
    delete real_subject;
    return 0;
}

在這個(gè)示例中,抽象類 Subject 定義了原始對象和代理對象共同的接口 request(),具體類 RealSubject 實(shí)現(xiàn)了原始對象的功能,代理類 Proxy 實(shí)現(xiàn)了代理對象的功能,并在轉(zhuǎn)發(fā)請求之前執(zhí)行了一個(gè)額外的操作 check_access()。在 main() 函數(shù)中,創(chuàng)建了一個(gè) RealSubject 對象和一個(gè) Proxy 對象,并通過 Proxy 對象調(diào)用了 request() 方法。

類圖如下:

二、遠(yuǎn)程代理(Remote proxy)

C++遠(yuǎn)程代理是一種設(shè)計(jì)模式,它允許客戶端通過代理對象間接訪問遠(yuǎn)程服務(wù)或?qū)ο?。這個(gè)模式通常被用于網(wǎng)絡(luò)編程中,比如RPC(遠(yuǎn)程過程調(diào)用)或分布式系統(tǒng)中。

// 假設(shè)這是遠(yuǎn)程服務(wù)端對象的頭文件
class RemoteService {
public:
    virtual void foo() = 0;
};
 
// 代理類,用于訪問遠(yuǎn)程服務(wù)端對象
class RemoteServiceProxy : public RemoteService {
public:
    RemoteServiceProxy(const std::string& host, int port) : m_host(host), m_port(port) {}
 
    void foo() override {
        // 連接遠(yuǎn)程服務(wù)端
        connect();
 
        // 向遠(yuǎn)程服務(wù)端發(fā)送請求
        sendRequest("foo");
 
        // 等待遠(yuǎn)程服務(wù)端響應(yīng)
        std::string response = receiveResponse();
 
        // 關(guān)閉連接
        disconnect();
 
        // 處理響應(yīng)
        processResponse(response);
    }
 
private:
    std::string m_host;
    int m_port;
    int m_socketFd;  // 保存套接字描述符,用于連接遠(yuǎn)程服務(wù)端
 
    void connect() {
        // 連接遠(yuǎn)程服務(wù)端代碼
    }
 
    void sendRequest(const std::string& request) {
        // 向遠(yuǎn)程服務(wù)端發(fā)送請求代碼
    }
 
    std::string receiveResponse() {
        // 從遠(yuǎn)程服務(wù)端接收響應(yīng)代碼
    }
 
    void disconnect() {
        // 關(guān)閉連接代碼
    }
 
    void processResponse(const std::string& response) {
        // 處理響應(yīng)代碼
    }
};
 
// 客戶端代碼
int main() {
    RemoteServiceProxy proxy("127.0.0.1", 8080);
    proxy.foo();  // 通過代理對象間接訪問遠(yuǎn)程服務(wù)端對象的foo()方法
    return 0;
}

上述代碼中,RemoteService是一個(gè)抽象基類,它定義了遠(yuǎn)程服務(wù)端對象的接口。RemoteServiceProxy是代理類,它通過套接字描述符連接遠(yuǎn)程服務(wù)端,并將客戶端的請求轉(zhuǎn)發(fā)給遠(yuǎn)程服務(wù)端??蛻舳酥恍枰ㄟ^代理對象訪問遠(yuǎn)程服務(wù)端的方法即可,而無需知道遠(yuǎn)程服務(wù)端的具體實(shí)現(xiàn)細(xì)節(jié)。

類圖如下:

三、虛擬代理(Virtual Proxy)

C++虛擬代理(Virtual Proxy)模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你創(chuàng)建一個(gè)代理對象來代替一個(gè)真實(shí)對象。該代理對象可以控制對真實(shí)對象的訪問,并在需要時(shí)才創(chuàng)建或加載真實(shí)對象。

代碼示例:

#include <iostream>
using namespace std;
 
// 定義一個(gè)抽象類Subject
class Subject {
public:
    virtual void request() = 0;
};
 
// 定義一個(gè)真實(shí)的Subject類RealSubject
class RealSubject : public Subject {
public:
    void request() {
        cout << "真實(shí)的請求" << endl;
    }
};
 
// 定義一個(gè)代理類Proxy
class Proxy : public Subject {
private:
    RealSubject *realSubject;
 
public:
    void request() {
        if (realSubject == nullptr) {
            realSubject = new RealSubject();
        }
        cout << "代理請求" << endl;
        realSubject->request();
    }
};
 
// 客戶端代碼
int main() {
    Proxy proxy;
    proxy.request();
    return 0;
}

在上面的示例中,我們定義了一個(gè)抽象類Subject和一個(gè)具體的類RealSubject,它們都實(shí)現(xiàn)了request()方法。然后我們定義了一個(gè)代理類Proxy,它也實(shí)現(xiàn)了request()方法,但是它首先檢查真實(shí)的主題是否已經(jīng)創(chuàng)建,如果沒有創(chuàng)建,則創(chuàng)建一個(gè)。然后代理類打印一條消息,表示代理請求。最后,它調(diào)用真實(shí)主題的request()方法。

在客戶端代碼中,我們實(shí)例化了一個(gè)代理對象,并調(diào)用了request()方法。由于我們使用了代理模式,所以當(dāng)我們調(diào)用代理對象的request()方法時(shí),它將首先創(chuàng)建真實(shí)對象(如果沒有創(chuàng)建),然后打印代理請求,最后調(diào)用真實(shí)對象的request()方法。

這種模式的一個(gè)好處是,它可以延遲創(chuàng)建真實(shí)對象的時(shí)間,直到它真正需要使用。這可以節(jié)省資源,特別是當(dāng)創(chuàng)建真實(shí)對象的代價(jià)很大時(shí)。

類圖:

四、保護(hù)代理(Protective Proxy)

C++中的保護(hù)代理(Protective Proxy)是一種結(jié)構(gòu)型設(shè)計(jì)模式,其目的是控制對對象的訪問。它使用一個(gè)代理對象來控制原始對象的訪問,代理對象通過限制或控制原始對象的訪問來提供額外的安全性和保護(hù)。

#include <iostream>
#include <string>
#include <memory>
 
class Image {
public:
    Image(std::string name) : name_(name) {}
    virtual void Display() = 0;
    virtual ~Image() {}
 
protected:
    std::string name_;
};
 
class RealImage : public Image {
public:
    RealImage(std::string name) : Image(name) {
        LoadFromDisk();
    }
 
    void Display() override {
        std::cout << "Displaying " << name_ << std::endl;
    }
 
private:
    void LoadFromDisk() {
        std::cout << "Loading " << name_ << " from disk" << std::endl;
    }
};
 
class ImageProxy : public Image {
public:
    ImageProxy(std::string name) : Image(name) {}
 
    void Display() override {
        if (real_image_ == nullptr) {
            real_image_ = std::make_unique<RealImage>(name_);
        }
        real_image_->Display();
    }
 
private:
    std::unique_ptr<RealImage> real_image_;
};
 
int main() {
    // Create a real image object
    auto real_image = std::make_unique<RealImage>("image1.jpg");
    
    // Display the real image
    real_image->Display();
 
    // Create an image proxy object
    auto image_proxy = std::make_unique<ImageProxy>("image2.jpg");
 
    // Display the image proxy
    image_proxy->Display();
 
    // The real image is only loaded once, even though it is displayed twice
    return 0;
}

在上面的示例代碼中,Image 是一個(gè)抽象基類,RealImage 和 ImageProxy 是具體的類。RealImage 是一個(gè)真實(shí)的圖像對象,它可以從磁盤中加載并顯示圖像。ImageProxy 是一個(gè)代理對象,它可以訪問真實(shí)圖像對象,并負(fù)責(zé)加載和顯示真實(shí)圖像對象。當(dāng)我們調(diào)用 ImageProxy 對象的 Display() 方法時(shí),它會(huì)首先檢查是否已經(jīng)加載了真實(shí)圖像對象。如果沒有加載,它將使用 RealImage 對象加載圖像。這種方式可以減少對真實(shí)圖像對象的頻繁訪問,從而提高程序的效率。

類圖:

五、緩存代理(Cache Proxy)

緩存代理模式的基本思路是:為了避免每次調(diào)用一個(gè)函數(shù)或方法時(shí)都要進(jìn)行重復(fù)的計(jì)算,我們可以將其結(jié)果緩存起來,下次需要時(shí)就可以直接返回緩存的結(jié)果,而不用再進(jìn)行計(jì)算。

#include <iostream>
#include <unordered_map>
 
using namespace std;
 
// 定義一個(gè)全局的緩存代理類
class FactorialCacheProxy {
public:
    int getFactorial(int n) {
        if (cache_.find(n) != cache_.end()) {
            // 如果結(jié)果已經(jīng)被緩存,直接返回緩存的結(jié)果
            cout << "Get result from cache: " << n << endl;
            return cache_[n];
        } else {
            // 如果結(jié)果沒有被緩存,進(jìn)行計(jì)算并緩存結(jié)果
            cout << "Calculate result: " << n << endl;
            int result = calculateFactorial(n);
            cache_[n] = result;
            return result;
        }
    }
private:
    // 計(jì)算階乘的實(shí)際函數(shù)
    int calculateFactorial(int n) {
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }
    // 使用一個(gè) unordered_map 來作為緩存
    unordered_map<int, int> cache_;
};
 
int main() {
    FactorialCacheProxy cacheProxy;
    for (int i = 5; i <= 7; i++) {
        int result = cacheProxy.getFactorial(i);
        cout << "Factorial of " << i << " is " << result << endl;
    }
    for (int i = 5; i <= 7; i++) {
        int result = cacheProxy.getFactorial(i);
        cout << "Factorial of " << i << " is " << result << endl;
    }
    return 0;
}

計(jì)算結(jié)果,并將結(jié)果緩存起來。之后再次調(diào)用相同的方法時(shí),直接從緩存中取出結(jié)果,不需要再進(jìn)行計(jì)算,從而提高了程序的性能。

六、總結(jié)

代理模式被代理的對象一定有奇特的地方,要么對象加載困難,要么計(jì)算困難,需要設(shè)計(jì)一個(gè)代理作為緩沖區(qū),在必要時(shí)代理才喚醒真正的對象。一切符合上面特性的都可以使用代理模式,設(shè)計(jì)模式都是自然而然的,都是解決程序運(yùn)行中的痛點(diǎn)應(yīng)運(yùn)而生的。

以上就是C++利用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理的詳細(xì)內(nèi)容,更多關(guān)于C++代理模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入理解C++中std::chrono庫的使用

    深入理解C++中std::chrono庫的使用

    在程序設(shè)計(jì)中,時(shí)間管理是一個(gè)核心概念,它不僅關(guān)系到程序的效率和性能,而且直接影響用戶體驗(yàn),C++作為一門高效的編程語言,提供了std::chrono庫,用于精確地處理和計(jì)算時(shí)間,下面就跟隨小編一起學(xué)習(xí)一下std::chrono庫的使用吧
    2023-12-12
  • 貪心算法 WOODEN STICKS 實(shí)例代碼

    貪心算法 WOODEN STICKS 實(shí)例代碼

    貪心算法 WOODEN STICKS 實(shí)例代碼,需要的朋友可以參考一下
    2013-05-05
  • 使用c語言判斷100以內(nèi)素?cái)?shù)的示例(c語言求素?cái)?shù))

    使用c語言判斷100以內(nèi)素?cái)?shù)的示例(c語言求素?cái)?shù))

    這篇文章主要介紹了使用c語言判斷100以內(nèi)素?cái)?shù)的示例(c語言求素?cái)?shù)),需要的朋友可以參考下
    2014-03-03
  • opencv實(shí)現(xiàn)圖形輪廓檢測

    opencv實(shí)現(xiàn)圖形輪廓檢測

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖形輪廓檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++之boost::array的用法

    C++之boost::array的用法

    這篇文章主要介紹了C++之boost::array的用法,以實(shí)例的形式簡單講述了靜態(tài)數(shù)組的容器boost::array的使用技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-10-10
  • MFC實(shí)現(xiàn)漂亮界面之美化按鈕

    MFC實(shí)現(xiàn)漂亮界面之美化按鈕

    這篇文章主要為大家詳細(xì)介紹了MFC實(shí)現(xiàn)漂亮界面之美化按鈕,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C++中Digraphs、Trigraphs和Tokens的深入講解

    C++中Digraphs、Trigraphs和Tokens的深入講解

    這篇文章主要給大家介紹了關(guān)于C++中Digraphs、Trigraphs和Tokens的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • C++之std::vector刪除元素的幾種方式及區(qū)別說明

    C++之std::vector刪除元素的幾種方式及區(qū)別說明

    這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • 淺談c++中的輸入輸出方法

    淺談c++中的輸入輸出方法

    下面小編就為大家?guī)硪黄獪\談c++中的輸入輸出方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • 詳解Qt中QStackedWidget控件的使用

    詳解Qt中QStackedWidget控件的使用

    這篇文章主要為大家詳細(xì)介紹了Qt中QStackedWidget控件的具體使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下
    2023-02-02

最新評論