網(wǎng)頁設(shè)計與制作視頻seo網(wǎng)絡(luò)推廣優(yōu)勢
代理模式是一種結(jié)構(gòu)型設(shè)計模式,為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者無法引用另一個對象,這個時候就需要一個代理對象充當(dāng)客戶端和目標(biāo)對象之間的中介。
代理模式就是代理對象具備目標(biāo)對象的所有功能,并代替真實對象完成相應(yīng)操作,在操作前或操作后進(jìn)行功能增強(qiáng)的工作。這也是代理對象和目標(biāo)對象之間的區(qū)別。
舉例:
以租房為例,租客想要租房,需要經(jīng)過房屋中介審核租客資料,審核通過之后才可以通知房東進(jìn)行租房。
// 抽象房東類
class Landlord
{
public:virtual ~Landlord() {}virtual void Rent() = 0;
};// 具體房東類
class RealLandlord: public Landlord
{
public:virtual void Rent() override{std::cout << "房東出租房屋" << std::endl;}
};// 中介代理
class EstateAgent: public Landlord
{
public:EstateAgent(){}virtual void Rent() override{if (CheckTenant()){std::cout << "中介已代理,接受租客請求" << std::endl;if (!landLord_)landLord_ = std::make_shared<RealLandlord>();landLord_->Rent();std::cout << "中介代理,簽訂租約" << std::endl;}elsestd::cout << "抱歉,您的資質(zhì)審核未通過" << std::endl;}private:bool CheckTenant(){// 檢查租客資質(zhì)// ....return true; // 假設(shè)檢查成功}private:std::shared_ptr<Landlord> landLord_;
};
測試:
void TestProxy()
{std::shared_ptr<Landlord> agent = std::make_shared<EstateAgent>();agent->Rent();
}
我們創(chuàng)建一個抽象房東類Landlord,定義了一個出租房屋的方法,一個真實目標(biāo)對象去實現(xiàn)這個方法。還創(chuàng)建了一個中介代理類EstateAgent代替真實目標(biāo)對象完成功能。
在中介代理類中,我們可以在出租房屋前后進(jìn)行一些增強(qiáng)操作,比如檢查租客資質(zhì)等。
客戶端方面,我們只需要創(chuàng)建一個代理對象,它會代替真實對象完成功能,客戶端就不需要關(guān)心真實對象的創(chuàng)建邏輯。
代理模式遵循的設(shè)計原則:
1、單一職責(zé)原則:代理模式在客戶端和實際對象之間額外增加了一個代理對象,使得代理對象具有更多的責(zé)任,而實際對象只需要專注自己的職責(zé)即可。
2、開放封閉原則:由于代理模式增加了代理類這一角色,所以可以在不修改現(xiàn)有代碼的情況下添加新的代理類達(dá)到添加新功能的需求。比如上述例子我們可以添加一個新的代理類,這個代理類的職責(zé)是只檢查房東資質(zhì)。該模式使得對實際對象的訪問和控制可以在代理層進(jìn)行變化和擴(kuò)展。
3、依賴倒置原則:代理模式通過引入抽象的代理接口,將客戶端從實際對象解耦,客戶端只需要面向代理接口編程,不需要直接依賴實際對象的具體實現(xiàn)。
優(yōu)點:
1、隱藏對象復(fù)雜性:代理對象封裝了實際對象的復(fù)雜性,使得客戶端對實際對象的操作變得簡單
2、提供額外的功能:代理對象可以在實際對象的基礎(chǔ)上添加額外的功能,比如日志記錄、權(quán)限驗證、緩存等。
3、提供性能:代理模式允許延遲加載對象(在使用的時候才加載對象),從而避免了資源消耗和提高性能。
4、保護(hù)實際對象:代理對象將實際對象的功能封裝起來,客戶端就不能對實際對象直接訪問
5、提供遠(yuǎn)程訪問能力:通過代理模式,客戶端可以訪問遠(yuǎn)程對象,比如從而實現(xiàn)分布式系統(tǒng)或系統(tǒng)調(diào)用。
缺點:
1、會增加代碼復(fù)雜性:代理模式增加了代理類作為客戶端和實際對象之間的中間層。
2、可能引起性能損失:在某些情況下,代理模式可能會引入額外的開銷,導(dǎo)致性能略有下降。
為什么會引起性能損失:
1、遠(yuǎn)程代理:當(dāng)使用遠(yuǎn)程代理時,由于需要通過網(wǎng)絡(luò)傳輸數(shù)據(jù),可能會引起性能下降。因此,應(yīng)該盡量減少網(wǎng)絡(luò)通信量,使用緩存或其他優(yōu)化技術(shù)。
2、虛擬代理:當(dāng)使用虛擬代理時,由于需要創(chuàng)建和初始化代理對象,可能會引起一定的性能下降。因此,應(yīng)該盡量減少代理對象創(chuàng)建的時間和開銷。
3、安全代理:當(dāng)使用安全代理時,由于需要進(jìn)行權(quán)限驗證和訪問控制,可能會引起一定的性能下降。因此,應(yīng)該盡量采用高效的算法和數(shù)據(jù)結(jié)構(gòu),減少耗時的操作。
4、智能引用代理:當(dāng)使用智能引用代理時,由于需要記錄對象的使用情況和狀態(tài),可能會引起一定的性能下降。因此,應(yīng)該盡量減少對代理對象的狀態(tài)記錄和操作。
5、延遲加載代理:當(dāng)使用延遲加載代理時,由于需要推遲實際對象的創(chuàng)建或加載,可能會引起一定的性能下降。因此,應(yīng)該盡量減少延遲加載的時間和開銷,避免對用戶體驗造成影響。