四人幫–代理設計模式

代理是另一種結構設計模式 ,可以“代表”另一個對象或“代替”另一個對象以訪問后面的對象。

何時使用此模式?

當我們需要創建一個包裝來覆蓋客戶端的主要對象的復雜性時,將使用代理模式。

有哪些使用場景?

  • 虛擬代理–設想一種情況,其中有多個數據庫調用來提取大尺寸圖像。 由于這是一項昂貴的操作,因此我們可以使用代理模式,該模式將創建多個代理并指向龐大的內存消耗對象進行進一步處理。 僅當客戶端首先請求/訪問該對象時,才創建真實對象,然后,我們可以僅引用代理來重用該對象。 這避免了對象的重復,從而節省了內存。
  • 遠程代理–可以將遠程代理視為RPC調用中的存根。 遠程代理提供了在不同地址位置中存在的對象的本地表示。 另一個示例可以是為遠程資源(例如Web服務或REST資源)提供接口。
  • 保護性代理–保護性代理充當授權層,以驗證實際用戶是否有權訪問適當的內容。 可以考慮一個有關在辦公室中提供受限Internet訪問的代理服務器的示例。 僅允許使用有效的網站和內容,其余的將被阻止。
  • 智能代理–智能代理通過在訪問對象時插入特定操作來提供附加的安全層。 一個示例可以是在訪問真實對象之前檢查它是否已鎖定,以確保沒有其他對象可以更改它。


結構體:

代理設計模式結構


參加者:

  • 主題–此對象定義RealSubject和Proxy的通用接口,以便可以在需要RealSubject的任何地方使用Proxy。
  • 代理–維護對RealSubject的引用,以便代理可以訪問它。 它還實現了與RealSubject相同的接口,因此可以使用Proxy代替RealSubject。 代理還控制對RealSubject的訪問,并且可以創建或刪除此對象。
  • RealSubject –這是代理代表的主要對象。


例:

我們將在本文中討論兩個示例。 第一個是虛擬代理模式,另一個是保護代理模式。

虛擬代理示例

如前所述,虛擬代理對于節省昂貴的內存資源很有用。 讓我們以實際圖像包含客戶端需要訪問的巨大數據為例。 為了節省我們的資源和內存,實現如下:

  • 創建一個供客戶端訪問的接口。 其所有方法將由ProxyImage類和RealImage類實現。
  • RealImage在其他系統上運行,并且包含可從數據庫訪問的圖像信息。
  • 在其他系統上運行的ProxyImage可以在新系統中表示RealImage。 使用代理,我們可以避免多次加載圖像。

類圖:

虛擬代理示例

代碼示例:

圖像.java

public interface Image {public void showImage();
}

RealImage.java

public class RealImage implements Image {private String fileName = null; public RealImage(String strFileName){this.fileName = strFileName;}@Overridepublic void showImage() {System.out.println('Show Image:' +fileName);}
}

ProxyImage.java

public class ProxyImage implements Image {private RealImage img= null;private String fileName = null;public ProxyImage(String strFileName) {this.fileName = strFileName;}/** (non-Javadoc)* @see com.proxy.virtualproxy.Image#showImage()*/@Overridepublic void showImage() {if(img == null){img = new RealImage(fileName);}img.showImage();}
}

客戶端程序

public class Client {
public static void main(String[] args) {final Image img1 = new ProxyImage('Image***1');final Image img2 = new ProxyImage('Image***2');img1.showImage();img2.showImage();}
}


保護代理示例:

  • 假設ABC公司啟動了一項新政策,即根據其角色現在禁止員工訪問Internet。 所有外部電子郵件網站將被阻止。 在這種情況下,我們創建InternetAccess接口,該接口由操作GrantInternetAccess()組成。
  • RealInternetAccess類,允許所有人訪問互聯網。 但是,為了限制此訪問,我們將使用ProxyInternetAccess類,該類將檢查用戶的角色并根據其角色授予訪問權限。

類圖:

保護代理示例

代碼示例:

互聯網:

public interface InternetAccess {public void grantInternetAccess();
}

RealInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

ProxyInternetAccess.java

public class RealInternetAccess implements InternetAccess {private String employeeName = null;public RealInternetAccess(String empName) {this.employeeName = empName;}@Overridepublic void grantInternetAccess() {System.out.println('Internet Access granted for employee: '+ employeeName);}
}

客戶端程序

public static void main(String[] args) {InternetAccess ia = new ProxyInternetAccess('Idiotechie');ia.grantInternetAccess();}


優點:

  • 如您在上面的示例中看到的,代理模式的優點之一是關于安全性。
  • 這種模式避免了對象的重復,這些對象可能是巨大的并且占用大量內存。 反過來,這可以提高應用程序的性能。
  • 遠程代理還通過在客戶端計算機上安裝本地代碼代理(存根),然后借助遠程代碼訪問服務器來確保安全性。

缺點/后果:

這種模式引入了另一層抽象,如果某些客戶端直接訪問RealSubject代碼,而其中一些可能訪問Proxy類,則有時可能會遇到問題。 這可能會導致不同的行為。

有趣的一點:

  • 相關模式之間幾乎沒有差異。 就像Adapter模式為其主題提供不同的接口,而Proxy模式提供與原始對象相同的接口,而裝飾器提供增強的接口。 裝飾器模式在運行時添加了其他行為。
  • Java API中使用的代理:java.rmi。*;

請不要忘記發表您的評論。 如果您喜歡本文,請通過社交網絡鏈接為您的朋友分享此文章。

下載示例代碼:


參考: Idiotechie博客上來自JCG合作伙伴 Mainak Goswami 的“四人幫–代理設計模式” 。

翻譯自: https://www.javacodegeeks.com/2012/11/gang-of-four-proxy-design-pattern.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/370991.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370991.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370991.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

面試題38_數字在排序數組中出現的次數

題目描寫敘述 統計一個數字在排序數組中出現的次數。解題思路 數組是排序的,所以反復出現的數字是相鄰排列的。 用二分查找算法,找到第一次出現的位置。和 最后一次出現的位置。 推斷第一次出現的位置條件為:當前數字的前一個是否與之相等。若…

Hex hsl 轉換 php,關于 RGB,HEX,HSL 顏色相互轉換

最近一段時間在折騰一個微信在線編輯器的項目,使用 UEditor 進行二次開發。關于 UEditor 的定制,用到的都太粗淺,官方文檔上都能找得到。主題使用的樣式表是 ueditor.css 而不是ueditor.min.css,定制主題要注意這一點。而對整個項…

使用inetaddress測試目標可達性_PDPS軟件機器人虛擬仿真:Smart Place功能介紹與使用方法...

概述對于機器人工作站或生產線的虛擬仿真,很大一部分的作用是找出機器人與工裝夾具等外圍設備的最佳布局位置。市面上大多數的工業機器人虛擬仿真軟件都有這種專門用于檢測機器人與外圍設備之間最佳布局位置的功能,比如DELMIA軟件中的“Auto Place”功能…

JAVA基礎3——常見關鍵字解讀(1)

常見的JAVA中的關鍵字 static static靜態變量 靜態變量:使用static關鍵字定義的變量。static可以修飾變量和方法,也有static靜態代碼塊。被static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說,它不依賴類特定的實例,被…

PostgreSQL PL / java簡介

現代數據庫允許以多種語言編寫存儲過程。 一種常見的實現語言是java.NB,本文討論了PostgreSQL特定的Java實現。 其他數據庫的詳細信息會有所不同,但是概念是相同的。 PL / Java的安裝 在Ubuntu系統上安裝PL / Java很簡單。 我將首先創建一個新模板templ…

強連通分量 圓桌騎士

題目描述 圓桌騎士是一個非常吸引人的職業。因此,在最近幾年里,亞瑟王史無前例的擴招圓桌騎士,并不令人驚訝。現在這里有許多圓桌騎士,每個圓桌騎士都收到一份珍貴的邀請函,被邀請去英靈殿圓桌。這些騎士將要環繞著坐在…

微信小程序echarts層級太高

項目中因為需求,底部的tab導航欄是自己寫的,在開發者工具中一切正常;但是在真機上頁面滑動時,echarts的層級比tab高,調過兩者的z-index后仍然如此。 經過查找后發現cover-view和cover-image替換tab的view后&#xff0…

php解密 碼表,php拼音碼表的生成

php拼音碼表的生成發布于 2014-09-07 11:12:52 | 90 次閱讀 | 評論: 0 | 來源: 網友投遞PHP開源腳本語言PHP(外文名: Hypertext Preprocessor,中文名:“超文本預處理器”)是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,入門門檻…

angular js 使用pdf.js_排名靠前的幾個JS框架發展趨勢和前景

轉載自:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。原文出處:https://blog.bitsrc.io/top-5-javascript-frameworks-past-present-and-future-8b6fda39de02隨著信息技術領域的發展,企業…

工廠設計模式案例研究

我有一份工作來檢查我們的項目代碼質量。 如果我在項目中發現任何障礙,必須將其報告給我的團隊負責人。 我發現了很多漏洞,我認為可以在博客上進行討論。 不是嘲笑作者,而是一起學習和改進自己。 像這段代碼一樣,這是我在我們的代…

【javascript】DOM操作方法(3)——document節點屬性

document.doctype //document.documentElement //來獲取html元素 document.defaultView //返回document對象所在的window對象 document.body //返回當前文檔的<body>節點 document.head //返回當前文檔的<head>節點 document.activeElement //返回當前文…

debian dhcp服務啟動不了_DHCP服務器配置

DHCP &#xff1d; Dynamic Host Configuration Protocol 基于TCP/IP&#xff0c;用于動態配置工作站網絡接口&#xff0c;使工作站的網絡接口管理自動化。DHCP服務器軟件dhcpd網站&#xff1a;http://www.isc.org安裝方法&#xff1a;#tar -zxvf dhcp-4.0.0.tar.gz#cd dhcp-4.…

澤西島的JSON模式生成

因此&#xff0c;在上一篇文章中&#xff0c;我討論了一個允許在WADL中使用JSON-Schema的建議&#xff0c;這篇文章探討了如何使它與最近構建的Jersey一起使用。 在1.16發布之前&#xff0c;您將必須下載/參考1.16SNAPSHOT。 如果您使用的是Maven&#xff0c;那么假設您已經有…

C++map類型 之 簡單介紹

一&#xff1a;map的前世今生&#xff08;1&#xff09;從關聯容器與順序容器說起。關聯容器通過鍵&#xff08;key&#xff09;存儲和讀取元素。而順序容器則通過元素在容器中的位置順序存儲和訪問元素&#xff08;vector,queue,stack,list等&#xff09;。關聯容器&#xff0…

MySql Socket 完成數據庫的增查Demo

需求: 利用MySql數據庫結合前端技術完成用戶的注冊(要求不使用Web服務技術),所以 Demo采用Socket技術實現Web通信. 第一部分:數據庫創建 數據庫采用mysql 5.7.18, 數據庫名稱為MyUser, 內部有一張表 user.字段有 Id,UserName,Psd,Tel 第二部分:數據庫連接與Socket通信 創建控…

oracle導數卡死,oracle-審計導數

1、因審計需求&#xff0c;需要將MySQL、Oracle數據庫中需要的表數據導入到SqlSERVER進行審計。2、之前的方法&#xff1a;A. oracle組將表dump下來&#xff0c;進行壓縮&#xff0c;傳送到oracle導數服務器(中轉服務器)&#xff0c;再進行還原&#xff0c;然后修改表結構&…

蘋果桌面主題_看膩了手機自帶的桌面主題,試試這個

在這個看臉的時代&#xff0c;顏值似乎越來越重要了。尤其是我們每天都要看到的手機桌面&#xff0c;如果它的顏值好一點&#xff0c;也許我們的心情會更好&#xff0c;所以有不少人都用手機自帶的主題來美化桌面&#xff0c;但是對于喜歡個性的我們&#xff0c;手機自帶的主題…

Java SE 11:推動Java向前發展

介紹 在我看來&#xff0c;這篇文章提出了Java語言應該如何發展以保持其作為首選語言的地位。 它還提供了一些我喜歡但有時&#xff08;可能永遠不會&#xff09;成為Java一部分的功能&#xff0c;由于我將要解釋的某些原因&#xff0c;這些功能有時我已經愛上了。 我真的很想…

python之property屬性

Property的概念&#xff1a;property是一種特殊的屬性&#xff0c;訪問它時會執行一段功能&#xff08;函數&#xff09;&#xff0c;然后返回值。 import mathclass Circle:def __init__(self,radius):#園的半徑radiusself.radiusradiusproperty#areaproperty(area)def area(s…

Hexo使用細節及各種問題

解決markdown圖片不顯示(返回403 forbidden)、添加本地圖片無法顯示、修改文章page模板、同時部署發布同步到多個倉庫站點(Github、coding、gitee 碼云) 圖片不顯示 在使用過程中&#xff0c;會發現有的引用圖片無法顯示的問題。但是如果直接復制圖片地址到瀏覽器打開的話顯示…