代理模式(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)設計模式
- Java設計模式之代理模式(Proxy)Java設計模式
- C++設計模式之Proxy模式(代理模式)C++設計模式
- Java中的代理模式(Proxy Pattern)Java模式
- 說透設計模式-代理模式與Proxy設計模式
- C#設計模式——代理模式(Proxy Pattern)C#設計模式
- 人人都會設計模式---代理模式--Proxy設計模式
- JAVA設計模式之 代理模式【Proxy Pattern】Java設計模式
- 設計模式--代理模式Proxy(結構型)設計模式
- C#設計模式系列:代理模式(Proxy)C#設計模式
- java23中設計模式–代理模式ProxyJava設計模式
- java23中設計模式--代理模式ProxyJava設計模式
- 設計模式的征途—13.代理(Proxy)模式設計模式
- ES6中的代理模式-----Proxy模式
- Head First 設計模式 —— 13. 代理 (Proxy) 模式設計模式
- 配置proxy代理
- 《Proxy系列專題》:代理模式(靜態、JDK、CGLib)模式JDKCGLib
- 代理(Proxy)的解析
- 設計模式系列之代理模式(Proxy Pattern)——物件的間接訪問設計模式物件
- Proxy模式模式
- Java代理設計模式(Proxy)的四種具體實現:靜態代理和動態代理Java設計模式
- 透明代理Transparent Proxy
- Java Proxy動態代理Java
- 代理(Proxy)和反射(Reflection)反射
- 【Java基礎】代理 - ProxyJava
- go proxy 實現反向代理Go
- proxy代理與伺服器伺服器
- VUE 未來代理操作:ES6 Proxy代理Vue
- 讀<設計模式之Proxy(代理)>後有兩個疑問。設計模式
- Proxy代理資料攔截方法
- 前端跨域方法之proxy(代理)前端跨域
- 反向代理伺服器(Reverse Proxy)伺服器
- jdk proxy invocationhandler (jdk動態代理)JDK
- Nginx proxy manager反向代理docker hubNginxDocker
- Java代理機制分析——JDK代理(Proxy、InvocationHandler與示例)JavaJDK
- 技術分享:Proxy-Pool代理池搭建IP代理
- iOS 設定代理(Proxy)方案總結iOS