溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2023-04-27 11:58:04 來(lái)源:億速云 閱讀:168 作者:iii 欄目:開發(fā)技術(shù)

本文小編為大家詳細(xì)介紹“C++怎么用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++怎么用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

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

    1.1 基礎(chǔ)

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

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

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

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

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

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

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

    1.2 代碼示例

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

    #include <iostream>
    using namespace std;
     
    // 定義抽象類 Subject,代表原始對(duì)象和代理對(duì)象共同的接口
    class Subject {
    public:
        virtual void request() = 0;
    };
     
    // 定義具體類 RealSubject,實(shí)現(xiàn)原始對(duì)象的功能
    class RealSubject : public Subject {
    public:
        void request() override {
            cout << "RealSubject: Handling request." << endl;
        }
    };
     
    // 定義代理類 Proxy,實(shí)現(xiàn)代理對(duì)象的功能
    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 定義了原始對(duì)象和代理對(duì)象共同的接口 request(),具體類 RealSubject 實(shí)現(xiàn)了原始對(duì)象的功能,代理類 Proxy 實(shí)現(xiàn)了代理對(duì)象的功能,并在轉(zhuǎn)發(fā)請(qǐng)求之前執(zhí)行了一個(gè)額外的操作 check_access()。在 main() 函數(shù)中,創(chuàng)建了一個(gè) RealSubject 對(duì)象和一個(gè) Proxy 對(duì)象,并通過(guò) Proxy 對(duì)象調(diào)用了 request() 方法。

    類圖如下:

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

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

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

    // 假設(shè)這是遠(yuǎn)程服務(wù)端對(duì)象的頭文件
    class RemoteService {
    public:
        virtual void foo() = 0;
    };
     
    // 代理類,用于訪問(wèn)遠(yuǎn)程服務(wù)端對(duì)象
    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ā)送請(qǐng)求
            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ā)送請(qǐng)求代碼
        }
     
        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();  // 通過(guò)代理對(duì)象間接訪問(wèn)遠(yuǎn)程服務(wù)端對(duì)象的foo()方法
        return 0;
    }

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

    類圖如下:

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

    三、虛擬代理(Virtual Proxy)

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

    代碼示例:

    #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í)的請(qǐng)求" << endl;
        }
    };
     
    // 定義一個(gè)代理類Proxy
    class Proxy : public Subject {
    private:
        RealSubject *realSubject;
     
    public:
        void request() {
            if (realSubject == nullptr) {
                realSubject = new RealSubject();
            }
            cout << "代理請(qǐng)求" << 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)建,如果沒(méi)有創(chuàng)建,則創(chuàng)建一個(gè)。然后代理類打印一條消息,表示代理請(qǐng)求。最后,它調(diào)用真實(shí)主題的request()方法。

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

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

    類圖:

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

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

    C++中的保護(hù)代理(Protective Proxy)是一種結(jié)構(gòu)型設(shè)計(jì)模式,其目的是控制對(duì)對(duì)象的訪問(wèn)。它使用一個(gè)代理對(duì)象來(lái)控制原始對(duì)象的訪問(wèn),代理對(duì)象通過(guò)限制或控制原始對(duì)象的訪問(wèn)來(lái)提供額外的安全性和保護(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í)的圖像對(duì)象,它可以從磁盤中加載并顯示圖像。ImageProxy 是一個(gè)代理對(duì)象,它可以訪問(wèn)真實(shí)圖像對(duì)象,并負(fù)責(zé)加載和顯示真實(shí)圖像對(duì)象。當(dāng)我們調(diào)用 ImageProxy 對(duì)象的 Display() 方法時(shí),它會(huì)首先檢查是否已經(jīng)加載了真實(shí)圖像對(duì)象。如果沒(méi)有加載,它將使用 RealImage 對(duì)象加載圖像。這種方式可以減少對(duì)真實(shí)圖像對(duì)象的頻繁訪問(wèn),從而提高程序的效率。

    類圖:

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

    五、緩存代理(Cache Proxy)

    緩存代理模式的基本思路是:為了避免每次調(diào)用一個(gè)函數(shù)或方法時(shí)都要進(jìn)行重復(fù)的計(jì)算,我們可以將其結(jié)果緩存起來(lái),下次需要時(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é)果沒(méi)有被緩存,進(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 來(lái)作為緩存
        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é)果緩存起來(lái)。之后再次調(diào)用相同的方法時(shí),直接從緩存中取出結(jié)果,不需要再進(jìn)行計(jì)算,從而提高了程序的性能。

    讀到這里,這篇“C++怎么用代理模式實(shí)現(xiàn)遠(yuǎn)程代理,虛擬代理和保護(hù)代理”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI