【提示:如果不想看文字介紹,可以直接跳轉(zhuǎn)到C++編碼部分】
【簡介】什么是代理模式
????????代理模式?Proxy Pattern?是?種結(jié)構(gòu)型設(shè)計模式,?于控制對其他對象的訪問。在代理模式中,允許?個對象(代理)充當(dāng)另?個對象(真實對象)的接?,以控制對這個對象的訪問。通常?于在訪問某個對象時引??些間接層(中介的作?),這樣可以在訪問對象時添加額外的控制邏輯,?如限制訪問權(quán)限,延遲加載。
?????????如說有?個?件加載的場景,為了避免直接訪問“?件”對象,我們可以新增?個代理對象,代理對象中有?個對“?件對象”的引?,在代理對象的 load ?法中,可以在訪問真實的?件對象之前進??些操作,?如權(quán)限檢查,然后調(diào)?真實?件對象的 load ?法,最后在訪問真實對象后進?其他操作,?如記錄訪問?志。
【基本結(jié)構(gòu)】
代理模式的主要??有:
- Subject(抽象主題): 抽象類,通過接?或抽象類聲明真實主題和代理對象實現(xiàn)的業(yè)務(wù)?法。
- RealSubject(真實主題):定義了Proxy所代表的真實對象,是客戶端最終要訪問的對象。
- Proxy(代理):包含?個引?,該引?可以是RealSubject的實例,控制對RealSubject的訪問,并可能負(fù)責(zé)創(chuàng)建和刪除RealSubject的實例。
【實現(xiàn)方式】
????????代理模式的基本實現(xiàn)分為以下?個步驟:(以Java代碼做示例)
1. 定義抽象主題, ?般是接?或者抽象類,聲明真實主題和代理對象實現(xiàn)的業(yè)務(wù)?法。
// 1. 定義抽象主題
interface Subject {
void request();
}
2.定義真實主題,實現(xiàn)抽象主題中的具體業(yè)務(wù)
?
// 2. 定義真實主題
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject handles the request.");
}
}
3.定義代理類,包含對RealSubject 的引?,并提供和真實主題相同的接?,這樣代理就可以替代真實主題,并對真實主題進?功能擴展。
// 3. 定義代理
class Proxy implements Subject {
// 包含?個引?
private RealSubject realSubject;
@Override
public void request() {
// 在訪問真實主題之前可以添加額外的邏輯
if (realSubject == null) {
realSubject = new RealSubject();
}
// 調(diào)?真實主題的?法
realSubject.request();
// 在訪問真實主題之后可以添加額外的邏輯
}
}
4.客戶端使?代理
// 4. 客戶端使?代理
public class Main {
public static void main(String[] args) {
// 使?代理
Subject proxy = new Proxy();
proxy.request();
}
}
【使用場景】
????????代理模式可以控制客戶端對真實對象的訪問,從?限制某些客戶端的訪問權(quán)限,此外代理模式還常?在訪問真實對象之前或之后執(zhí)??些額外的操作(?如記錄?志),對功能進?擴展。
????????以上特性決定了代理模式在以下?個場景中有著?泛的應(yīng)?:
- 虛擬代理:當(dāng)?個對象的創(chuàng)建和初始化?較昂貴時,可以使?虛擬代理,虛擬代理可以延遲對象的實際創(chuàng)建和初始化,只有在需要時才真正創(chuàng)建并初始化對象。
- 安全代理:安全代理可以根據(jù)訪問者的權(quán)限決定是否允許訪問真實對象的?法。
????????但是代理模式涉及到多個對象之間的交互,引?代理模式會增加系統(tǒng)的復(fù)雜性,在需要頻繁訪問真實對象時,還可能會有?些性能問題。
????????代理模式在許多?具和庫中也有應(yīng)?:
- Spring 框架的 AOP 模塊使?了代理模式來實現(xiàn)切?編程。通過代理,Spring 能夠在?標(biāo)對象的?法執(zhí)?前、執(zhí)?后或拋出異常時插?切?邏輯,?不需要修改原始代碼。
- Java 提供了動態(tài)代理機制,允許在運?時?成代理類。
- Android中的Glide框架使?了代理模式來實現(xiàn)圖?的延遲加載。
【擴展】代理模式和適配器模式有什么區(qū)別
????????代理模式的主要?的是控制對對象的訪問。通常?于在訪問真實對象時引??些額外的控制邏輯,如權(quán)限控制、延遲加載等。
????????適配器模式的主要?的是使接?不兼容的對象能夠協(xié)同?作。適配器模式允許將?個類的接?轉(zhuǎn)換成另?個類的接?,使得不同接?的類可以協(xié)同?作。
【C++ 編碼部分】
1. 題目描述
????????小明想要購買一套房子,他決定尋求一家房屋中介來幫助他找到一個面積超過100平方米的房子,只有符合條件的房子才會被傳遞給小明查看。
2. 輸入描述
????????第一行是一個整數(shù) N(1 ≤ N ≤ 100),表示可供查看的房子的數(shù)量。接下來的 N 行,每行包含一個整數(shù),表示對應(yīng)房子的房屋面積。
3. 輸出描述
????????對于每個房子,輸出一行,表示是否符合購房條件。如果房屋面積超過100平方米,輸出 "YES";否則輸出 "NO"。
4. C++編碼實例
/**
* @version Copyright (c) 2024 NCDC, Servo。 Unpublished - All rights reserved
* @file ProxyMode.hpp
* @brief 代理模式
* @autor 寫代碼的小恐龍er
* @date 2024/01/10
*/
#include<iostream>
#include<string>
using namespace std;
// 抽象主題 -- 買房子的人 和 其代理類的 基類 實現(xiàn)業(yè)務(wù)方法
class AbstractHome
{
public:
virtual void BuyInfo() = 0;
};
// 真實主題 -- 買房子的類
class HomeBuyer : public AbstractHome
{
public:
void BuyInfo() override{
std::cout << "YES" << endl;
}
};
// 【!代理類】 真實類的行為全權(quán)由代理類代替
class HomeProxy : public AbstractHome
{
// 包含真實類的實例化對象
private:
HomeBuyer *_homeBuyer = nullptr;
// 在創(chuàng)建代理類時 一并創(chuàng)建真實類
public:
HomeProxy(){
if(_homeBuyer == nullptr) {
_homeBuyer = new HomeBuyer();
}
}
// 將真實類的各個需求屬性放置在代理類種
private:
int _areaSize = 0;
// 重寫真實類的各個行為
public:
// 一種方法是可以將 判斷屬性加至代理者的私有屬性種 另一種是將其作為參數(shù)傳入進去
void SetAreaSize(int size){
this->_areaSize = size;
}
void BuyInfo() override{
if(_areaSize > 100) _homeBuyer->BuyInfo();
else std::cout << "NO" << endl;
}
};
// 客戶端代碼
int main()
{
// 輸入的房子數(shù)量
int homeNum = 0;
std::cin >> homeNum;
// 創(chuàng)建代理類
AbstractHome *buyerAbstractProxy = new HomeProxy();
// 設(shè)置代理類 將抽象類向下類型轉(zhuǎn)換
HomeProxy *homeProxy = dynamic_cast<HomeProxy *>(buyerAbstractProxy);
for(int i = 0; i < homeNum; i++)
{
// 房子的面積大小 -- 需要告知給代理 讓其做邏輯判斷
int areaSize = 0;
std::cin >> areaSize;
homeProxy->SetAreaSize(areaSize);
// 開始進行邏輯判斷
homeProxy->BuyInfo();
}
delete buyerAbstractProxy;
buyerAbstractProxy = nullptr;
return 0;
}
......文章來源:http://www.zghlxwxcb.cn/news/detail-794435.html
To be continued.文章來源地址http://www.zghlxwxcb.cn/news/detail-794435.html
到了這里,關(guān)于C++ 設(shè)計模式之代理模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!