代理模式(Proxy)
目的
為另一個物件提供代理或佔位符以控制對它的訪問。
說明
想象一座塔,當地巫師去那裡學習他們的法術。象牙塔只能透過代理訪問,這確保只有前三個巫師可以進入。這裡的代理代表了塔臺的功能,並新增了訪問控制。
簡而言之,使用代理模式,類表示另一個類的功能。
維基百科說
代理以其最一般的形式,是一個類,充當其他東西的介面。代理是一個包裝器或代理物件,客戶端正在呼叫它以便在後臺訪問真正的服務物件。使用代理可以簡單地轉發到真實物件,或者可以提供額外的邏輯。在代理中,可以提供額外的功能,例如,當對真實物件的操作佔用大量資源時進行快取,或者在呼叫對真實物件的操作之前檢查前提條件。
程式化示例
以我們的巫師塔為例。首先我們有巫師塔介面和象牙塔類
public interface WizardTower { void enter(Wizard wizard); } public class IvoryTower implements WizardTower { private static final Logger LOGGER = LoggerFactory.getLogger(IvoryTower.class); public void enter(Wizard wizard) { LOGGER.info("{} enters the tower.", wizard); } } |
然後是一個簡單的嚮導類
public class Wizard { private final String name; public Wizard(String name) { this.name = name; } @Override public String toString() { return name; } } |
然後我們有了代理來新增對嚮導塔的訪問控制
public class WizardTowerProxy implements WizardTower { private static final Logger LOGGER = LoggerFactory.getLogger(WizardTowerProxy.class); private static final int NUM_WIZARDS_ALLOWED = 3; private int numWizards; private final WizardTower tower; public WizardTowerProxy(WizardTower tower) { this.tower = tower; } @Override public void enter(Wizard wizard) { if (numWizards < NUM_WIZARDS_ALLOWED) { tower.enter(wizard); numWizards++; } else { LOGGER.info("{} is not allowed to enter!", wizard); } } } |
這裡是塔樓進入場景
WizardTowerProxy proxy = new WizardTowerProxy(new IvoryTower()); proxy.enter(new Wizard("Red wizard")); // Red wizard enters the tower. proxy.enter(new Wizard("White wizard")); // White wizard enters the tower. proxy.enter(new Wizard("Black wizard")); // Black wizard enters the tower. proxy.enter(new Wizard("Green wizard")); // Green wizard is not allowed to enter! proxy.enter(new Wizard("Brown wizard")); // Brown wizard is not allowed to enter! |
適用場景
當需要一個比簡單指標更通用或更復雜的物件引用時,代理就適用。下面是代理模式適用的幾種常見情況
- 遠端代理為不同地址空間中的物件提供本地代理。
- 虛擬代理按需建立昂貴的物件。
- 保護代理控制對原始物件的訪問。當物件具有不同的訪問許可權時,保護代理很有用。
典型用例
- 控制對其他物件的訪問
- 延遲初始化
- 實施日誌記錄
- 方便網路連線
- 計算對物件的引用
相關文章
- 代理模式(Proxy Pattern)模式
- 設計模式之代理模式(proxy pattern)設計模式
- C++設計模式之Proxy模式(代理模式)C++設計模式
- C#設計模式——代理模式(Proxy Pattern)C#設計模式
- 說透設計模式-代理模式與Proxy設計模式
- Java中的代理模式(Proxy Pattern)Java模式
- java23中設計模式–代理模式ProxyJava設計模式
- java23中設計模式--代理模式ProxyJava設計模式
- Head First 設計模式 —— 13. 代理 (Proxy) 模式設計模式
- 《Proxy系列專題》:代理模式(靜態、JDK、CGLib)模式JDKCGLib
- 設計模式系列之代理模式(Proxy Pattern)——物件的間接訪問設計模式物件
- 代理(Proxy)的解析
- Proxy模式模式
- Java代理設計模式(Proxy)的四種具體實現:靜態代理和動態代理Java設計模式
- go proxy 實現反向代理Go
- VUE 未來代理操作:ES6 Proxy代理Vue
- Nginx proxy manager反向代理docker hubNginxDocker
- Proxy代理資料攔截方法
- Java代理機制分析——JDK代理(Proxy、InvocationHandler與示例)JavaJDK
- 技術分享:Proxy-Pool代理池搭建IP代理
- nginx的反向代理proxy_pass指令Nginx
- Nginx代理緩衝 proxy_buffering 配置Nginx
- iOS 設定代理(Proxy)方案總結iOS
- AndroidStudio清除重置Http Proxy代理的方式AndroidHTTP
- 前端 | Nuxt.js axios baseURL,proxy 代理前端UXJSiOS
- 部署一臺Zabbix Proxy代理服務
- 代理模式模式
- 使用shadowtunnel為proxy代理配置多級隧道
- 資料劫持Object.defineProperty與代理ProxyObject
- 使用 Nginx Proxy Manager反向代理開啟SSLNginx
- nginx location 和proxy_pass 代理說明Nginx
- 代理模式 - 動態代理模式
- 設計模式-代理模式設計模式
- 設計模式----代理模式設計模式
- 設計模式~代理模式設計模式
- 【設計模式】代理模式設計模式
- 設計模式——代理模式設計模式
- 代理模式增強之路(代理+責任鏈模式)模式