C++設計模式淺識代理模式

黄舟
發布: 2017-01-18 15:01:09
原創
1196 人瀏覽過

代理模式(Proxy): 為其他物件提供一個代理程式以控制對這個物件(被代理者,即本人)的存取。 

在C#中實作方法是使用介面interface定義所需的方法,而在C++中需要實作一個類別作為介面使用,其中定義所需的方法。這樣對我話,本人並不需要參與其中的具體活動,而由代理人出面。客戶端(第三方)也不認識本人,達到代理的作用。 

上面的意思是:使用一個類別封裝所需的代理方法。

代理模式應用:

遠端創建,也就是為一個物件在不同的位址空間提供局部代表。這樣可以隱藏一個物件存在於不同位址空間的事實。 【DP】

虛擬代理,是根據需要建立開銷很大的物件。透過它來存放實例化需要很長時間的真是對象,例如:打開一個很大的HTML網頁,我們看到的圖片是一張下載後才能看到,而未打開的圖片框, 就是透過虛擬代理來替代真實的圖片。此時代理程式儲存了真實圖片的路徑和尺寸。

安全代理,用來控制真時物件存取時的權限【DP】,一般用於物件應該有不同存取權限的時候。

智能指引,是指當調用真實的對象時,代理處理另外一些事【DP】​​。

在此以代辦手機方案為例:

測試用例:

[code]int main(){//整个过程中,本人都没有出现
    std::string name = "Jarrett";
    //第三方公司
    Company cp(name);  //申请人(本人)的名字告诉公司

    //代理人
    Proxy *px = new Proxy(cp);

    //办理58元套餐
    px->A58();
    //办理88元套餐
    px->A88();
    //办理128元套餐
    px->A128();

    return 0;
}
登入後複製

Proxy類別實作方法:

[code]//主体,提供接口。无需实例化,定义为纯虚函数
class Subject{
public:
    virtual void A58()const = 0;
    virtual void A88()const = 0;
    virtual void A128()const = 0;
};

//第三方公司
class Company{   
public:
    std::string name; //公司要知道办理套餐本人的名字
    Company(std::string na):name(na){}  
};

//本人(被代理人)
class oneSelf: public Subject{
private:
    Company cp; //本人要知道自己对谁做什么,此处自己知道要对哪个公司办理套餐
public:
    oneSelf(Company c):cp(c){} //此处由代理类来初始化

    void A58()const override{
        std::cout << cp.name << " for 58 packages.\n"; //告诉移动公司,我要办58套餐
    }

    void A88()const override{
        std::cout << cp.name << " for 88 packages.\n";
    }

    void A128()const override{
        std::cout << cp.name << " for 128 packages.\n";
    }
};

class Proxy:public Subject{
private:
    //代理谁?
    oneSelf os;
public:
    Proxy(Company cp):os(oneSelf(cp)){}  //此处初始化本人的构造函数,达到了代理的目的
    void A58()const override{
        os.A58();
    }

    void A88()const override{
        os.A88();
    }

    void A128()const override{
        os.A128();
    }

};
登入後複製

以上就是C++設計模式淺識代理模式的內容,更多相關內容www .php.cn)!


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板