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