C++設計模式之《代理模式》

簡介:

通過代理模式可以在原有業務邏輯外增加一定的約束,比如排序、範圍限制等等,無論具體主體還是代理主體都實現抽象主題

  • Subject抽象主題角色
    抽象主題類可以是抽象類也可以是接口, 是一個最普通的業務類型定義, 無特殊要求。
  • RealSubject具體主題角色
    也叫做被委託角色、 被代理角色。業務邏輯的具體執行者。
  • Proxy代理主題角色
    也叫做委託類、 代理類。 它負責對真實角色的應用, 把所有抽象主題類定義的方法限制委託給真實主題角色實現, 並且在真實主題角色處理完畢前後做預處理和善後處理工作。

優點: 職責清晰;高擴展性;智能化

缺點:引入了另一個抽象層;影響速度

理解:a中包含b類,a、b類實現協議類protocol。

場景:爲其它對象提供一種代理以控制對這個對象的訪問

UML類圖:

 簡單示例:

#include <iostream>

using namespace std;



class Subject
{
public:
    virtual void request() = 0;
};

class RealSubject : public Subject
{
public:
    void request()
    {
        cout<<"真實的請求"<<endl;
    }
};

class StandardPoxy : public Subject
{
public:
    void request()
    {
        if( m_subject == nullptr)
            m_subject = new RealSubject();

        m_subject->request();

        cout<<"代理的請求"<<endl;
    }
private:
    RealSubject *m_subject = nullptr;
};

調用代碼

#include "stander_proxy.h"

int main()
{
    StandardPoxy *sp = new StandardPoxy;
    sp->request();
    return 0;
}

再來一例 《大話設計模式》第七章送禮物

UML類圖:

代碼:

#ifndef FALL_IN_LOVE_H
#define FALL_IN_LOVE_H

#include <iostream>
using namespace std;

class SchoolGirl
{
public:
    string getName() {
        return m_name;
    }

    void setName(string name) {
        m_name = name;
    }

private:
    string m_name;
};


class GiveGift
{
public:
    void giveDolls();
    void giveFlowers();
    void giveChocolate();
};

class Pursuit : public GiveGift
{
public:
    Pursuit(SchoolGirl *mm)
    {
        m_mm = mm;
    }

    string getName() {
        return m_name;
    }

    void setName(string name) {
        m_name = name;
    }

    void giveDolls()
    {
        //cout<<m_mm->getName()<<":送你洋娃娃"<<endl;
        cout<<m_name<<":送["<<m_mm->getName()<<"]洋娃娃"<<endl;
    }

    void giveFlowers()
    {
        //cout<<m_mm->getName()<<":送你鮮花"<<endl;
        cout<<m_name<<":送["<<m_mm->getName()<<"]鮮花"<<endl;
    }

    void giveChocolate()
    {
        //cout<<m_mm->getName()<<": 送你巧克力"<<endl;
        cout<<m_name<<":送["<<m_mm->getName()<<"]巧克力"<<endl;
    }

private:
    SchoolGirl *m_mm;
    string m_name;
};

class Proxy: public GiveGift
{
public:
    Proxy(SchoolGirl *mm)
    {
        m_gg = new Pursuit(mm);
        m_gg->setName("胡漢三");
    }

    void giveDolls()
    {
        m_gg->giveDolls();
    }

    void giveFlowers()
    {
        m_gg->giveFlowers();
    }

    void giveChocolate()
    {
        m_gg->giveChocolate();
    }

private:
    Pursuit *m_gg;
};



#endif // FALL_IN_LOVE_H

 調用代碼:


#include "fall_in_love.h"

int main()
{


    SchoolGirl *jiaojiao = new SchoolGirl;
    jiaojiao->setName("李嬌嬌");

    Proxy *daili = new Proxy(jiaojiao);
    daili->giveDolls();
    daili->giveFlowers();
    daili->giveChocolate();

    return 0;
}

 運行結果:

 代理模式看起來簡單,但是要真正的在項目中運用也並沒有那麼簡單。下面對代理進行擴展,以便加深記憶:

普通代理

普通代理, 它的要求就是客戶端只能訪問代理角色, 而不能訪問真實角色.

強制代理

一般的思維都是通過代理找到真實的角色, 但是強制代理卻是要“強制”, 你必須通過真實角色查找到代理角色, 否則不能訪問。

動態代理

實現階段不用關心代理誰,而在運行階段指定代理哪一個對象。AOP(Aspect Oriented Programming)面向橫切面編程。核心就是動態代理。 AOP編程沒有使用什麼新的技術, 但是它對我們的設計、 編碼有非常大的影響, 對於日誌、 事務、 權限等都可以在系統設計階段不用考慮, 而在設計後通過AOP的方式切過去。

本篇部分內容來自於博客:https://www.coologic.cn/2017/12/802/,再次感謝博主。

本篇內容是我學習《大話設計模式》一書中代理模式章節的筆記,以便自己理解和分享。以後有更深層的理解會不定時更新該篇文章,也請高手能在評論區做出指點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章