簡體   English   中英

適配器和代理模式之間的確切區別是什么?

[英]What is the exact difference between Adapter and Proxy patterns?

據我了解,適配器代理模式都使兩個不同/不同的類/對象彼此兼容以進行通信。 它們都是結構模式。 我發現他們兩個彼此非常相似。

有人能解釋一下究竟是什么讓它們與眾不同嗎?

編輯:我經歷了這個問題。 但我更願意對 Adapter 和 Proxy 進行仔細比較。

適配器:

  1. 它允許兩個不相關的接口通過不同的對象一起工作,可能扮演相同的角色。
  2. 它修改了原始界面。

UML圖:

在此輸入圖像描述

您可以通過此SE帖子中的工作代碼示例找到有關此模式的更多詳細信息:

橋模式和適配器模式之間的差異

代理:

代理為另一個對象提供代理或占位符以控制對它的訪問。

UML圖:

在此輸入圖像描述

存在代理模式適用的常見情況。

  1. 虛擬代理是“創建昂貴”對象的占位符。 僅在客戶端首次請求/訪問對象時才創建真實對象。
  2. 遠程代理為駐留在不同地址空間中的對象提供本地代表。 這就是RPC和CORBA中提供的“存根”代碼。
  3. 保護代理控制對敏感主對象的訪問。 “代理”對象在轉發請求之前檢查調用者是否具有所需的訪問權限。
  4. 智能代理提供對某些對象的復雜訪問,例如跟蹤對象的引用數量,如果達到某個數量則拒絕訪問,以及根據需要將數據庫中的對象加載到內存中

有關工作代碼,請查看有關Proxy的tutorialspoint文章。

主要差異:

  1. 適配器為其主題提供不同的界面。 代理提供相同的接口
  2. 適配器旨在更改現有對象的接口

您可以在代理適配器文章的sourcemaking文章中找到有關這些模式的更多詳細信息。

其他有用的文章:dzone 代理

這里

適配器為其主題提供不同的界面。 代理提供相同的接口。

您可能會認為適配器應該使一件事適合另一件適合的,如果直接連接則不兼容。 例如,當您出國旅行時,需要一個電源插座適配器。

現在,Proxy是同一接口的對象,可能是相同的基類(或子類)。 它只是“假裝”成為(並且表現得像)實際對象,而是將實際行為(計算,處理,數據訪問等)轉發給底層的引用對象。

根據電氣類比推斷,客戶端可以看到適配器的使用 - 也就是說,客戶端“知道”正在使用適配器 - 而代理的使用可能更常被隱藏,或者“透明“ - 客戶端認為正在使用實際對象,但它只是一個代理。

在實踐中,包裝器適配器代理的概念是如此密切相關,以至於這些術語可以互換使用。

  • 顧名思義,包裝器實際上是圍繞另一個 object 或 function 的東西。例如,調用另一個 function 的 function,或管理另一個 object 的生命周期並轉發請求和轉發響應的 object。

  • 適配器從字面上適應合同。 這通常是指更改 object 的接口,或更改方法簽名。 在這兩種情況下,這只能通過用不同的 object 或 function 包裝來實現。

  • 代理這個詞用於完全相同的事情。 但是,一些來源會更明確地使用它來引用適配器來訪問遠程資源。 基本上,這意味着本地呼叫將被轉發到遠程 object 定義一個公共接口似乎很自然,然后可以在本地和遠程為這些對象共享/重用。

注意:代理模式的后一種解釋不再是真正的東西了。 這種方法在CORBA等技術炙手可熱的時代是有意義的。 如果您要訪問遠程服務,那么明確定義請求、響應和上下文對象並使用 OpenAPI 或 XSD 等技術會更有意義。

適配器模式和代理模式之間的區別

適配器模式

  1. 印度移動充電器(CLIENT)不適用於美國開關板(SERVER)。
  2. 您需要使用適配器,以便印度移動充電器(CLIENT)可以放入美國開關板(SERVER)。
  3. 從第2點開始,您可以了解CLIENT直接聯系適配器。 然后適配器聯系服務器

代理模式

  • 在適配器模式客戶端直接聯系適配器 它不聯系服務器。
  • 在代理模式中,代理和服務器實現相同的接口。 客戶端將調用相同的接口。

了解通過代碼

class client{
    public void main(){
      //proxy pattern
      IServer iserver = new proxy();
      iserver.invoke();

      //adapter pattern
      IAdapter iadapter = new adapter();
      iserver.iadapter();
    }
}

class server implements IServer{
    public void invoke(){}
}

class proxy implments IServer{
  public void invoke(){}
}

class adapter implements IAdapter{
  public void invoke(){}
}

參考: 適配器模式和代理模式之間的區別

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM