Java中的代理设计模式
代理對象或代理對象為另一個對象提供占位符,以控制對該對象的訪問。 代理充當原始對象的輕量級版本或簡化版本。 它支持與原始對象相同的操作,但可以將那些請求委托給原始對象以實現它們。
代理設計模式是一種結構模式,其中代理類包裝了實際的主題類。 客戶代碼僅與代理類交互,而不與真實主題交互。
在本教程中,我們將學習如何實現代理設計模式。
為什么要使用代理?
在三種最常見的情況下,我們可能需要代理類:
UML圖:
代理設計模式包含以下組件:
- 主題:定義實際主題合同的接口
- RealSubject :這是我們要為其提供代理的類
- 代理:這是真實主題的代理類。 Proxy和RealSubject類均實現Subject接口
- 客戶端 :通過Subject接口與代理交互的類
Proxy和RealSubject類均實現Subject接口。 同樣,客戶端與Subject界面進行交互,因此它隱藏了客戶端與代理進行交互而不是真實主題的事實。
代理類包裝實際主題,并且可以將一些請求委托給真實主題。 但是,并非所有請求都委托給Subject類。 代理能夠處理一些較輕的職責。
示例實現:
大多數組織在其場所內提供受限的Internet訪問權限。 那么,如何實施呢?
這個想法是創建一個保護代理。
讓我們先定義一個WebServer接口:
public interface WebServer { void makeRequest(String url); }在這里, makeRequest()方法負責使用特定端點對Web服務器進行調用。
現在,讓我們實現RealWebServer類,該類完成通過網絡API調用命中URL的實際工作:
public class RealWebServer implements WebServer { ????@Override public void makeRequest(String url) { //code to hit a particular url } }最后,我們將創建一個代理服務器并將其公開給我們的客戶:
public class ProxyServer implements WebServer { ?private RealWebServer realServer; private List<String> blockedSites = new ArrayList<>(); ?public ProxyWebServer() { this .realServer = new RealWebServer(); } RealWebServer(); } ?public void blockWebsite(String url) { this .blockedSites.add(url); } ?@Override public void makeRequest(String url) { if (!blockedSites.contains(url)) { this .realServer.makeRequest(url); } else { System.out.println( "This website is blocked. Contact your administrator" ); } } }這樣一來,所有被阻止的網站將在場所內不可用:
//code in main method WebServer server = new ProxyWebServer(); server.blockWebsite( "www.facebook.com" ); ... server.makeRequest( "www.facebook.com" ); // Prints 'This website is blocked. Contact your administrator'結論:
在本教程中,我們探討了代理設計模式。
代理模式使我們可以推遲創建昂貴的資源,直到需要它為止,控制對真實主題的訪問或在本地表示遠程對象。
Java Reflection API依賴于代理。 同樣,Hibernate的惰性獲取邏輯在內部使用了這種模式。
翻譯自: https://www.javacodegeeks.com/2019/09/proxy-design-pattern-java.html
總結
以上是生活随笔為你收集整理的Java中的代理设计模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JMetro 5.5版发布
- 下一篇: 仿制药名言_仿制药的美丽与陌生