簡介:
通過代理模式可以在原有業務邏輯外增加一定的約束,比如排序、範圍限制等等,無論具體主體還是代理主體都實現抽象主題
- 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/,再次感謝博主。
本篇內容是我學習《大話設計模式》一書中代理模式章節的筆記,以便自己理解和分享。以後有更深層的理解會不定時更新該篇文章,也請高手能在評論區做出指點。