1. 程式人生 > >裝飾者模式,代理模式與介面卡模式的比較

裝飾者模式,代理模式與介面卡模式的比較

裝飾者與適配者模式的區別
1.關於新職責:介面卡也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。
2.關於原介面:介面卡模式是用新介面來呼叫原介面,原介面對新系統是不可見或者說不可用的。裝飾者模式原封不動的使用原介面,系統對裝飾的物件也通過原介面來完成使用。(增加新介面的裝飾者模式可以認為是其變種--“半透明”裝飾者)
3.關於其包裹的物件:介面卡是知道被適配者的詳細情況的(就是那個類或那個介面)。裝飾者只知道其介面是什麼,至於其具體型別(是基類還是其他派生類)只有在執行期間才知道


http://www.cnblogs.com/jaredlam/archive/2011/11/08/2241089.html
對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個介面。
對代理模式來說,代理類(proxy class)和真實處理的類(real class)都實現同一個介面。此外,不論我們使用哪一個模式,都可以很容易地在真實物件的方法前面或者後面加上自定義的方法。
然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。
裝飾器模式關注於在一個物件上動態的新增方法,然而代理模式關注於控制對物件的訪問。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隱藏一個物件的具體資訊。
因此,當使用代理模式的時候,我們常常在一個代理類中建立一個物件的例項。並且,當我們使用裝飾器模式的時候,我們通常的做法是將原始物件作為一個引數傳給裝飾者的構造器。


http://jqsl2012.iteye.com/blog/1391448
代理模式是一種很常用的設計模式,其目的是對其他物件提供一種代理以控制對這個物件的訪問。 
代理模式又分為靜態代理和動態代理,靜態代理是在程式執行之前就已經存在了代理類,動態代理是程式執行中在記憶體中生成代理類。 
代理模式存在的意義:代理模式是為了解決濫用繼承的問題而生的,當想對某個類的功能進行擴充的時候可以使用繼承或聚合,很明顯用繼承的話會造成類氾濫,還有一點就是繼承是類具有很強的層級關係的情況下用才好,而緊緊對某個類進行功能的擴充就拿起繼承的大刀明顯的不合適,那麼用聚合呢?
                    聚合是一種鬆耦合的,用聚合建立的代理類就是靜態代理,還有更好的代理是動態代理。 
動態代理自己實現其實也很簡單,不過JDK提供了方便的解決方案。 
java.lang.reflect.InvocationHandler 
java.lang.reflect.Proxy 
這兩個東東就是為動態代理而生的 

其實裝飾模式和代理模式極為相似,更近一步,裝飾模式和靜態代理極為相似

相同點:都是為被代理(被裝飾)的類擴充新的功能。 
不同點:代理模式具有控制被代理類的訪問等性質,而裝飾模式緊緊是單純的擴充被裝飾的類。所以區別僅僅在是否對被代理/被裝飾的類進行了控制而已。  

相關推薦

裝飾模式代理模式介面卡模式比較

裝飾者與適配者模式的區別 1.關於新職責:介面卡也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。 2.關於原介面:介面卡模式是用新介面來呼叫原介面,原介面對新系統是不可見或者說不可用的。裝飾者模式原封不動的使用原介面,系統對裝飾的物件也通過原介面來完成使用。(增加新介

Java IO框架介面卡模式裝飾模式

IO框架: 介面卡模式: 介面卡模式(Adapter Pattern)是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,讀卡器是作為記憶體卡和筆

《設計模式》之一文帶你理解建造模式、模板方法、介面卡模式、外觀模式

我的github,到時上傳例子程式碼 https://github.com/tihomcode 《設計模式》之一文帶你理解單例、JDK動態代理、CGLIB動態代理、靜態代理 建造者模式 什麼是建造者模式 建造者模式:是將一個複雜的物件的構建與它的表示分離,使得

Swift 中的設計模式 #3 外觀模式介面卡模式

作者:Andrew Jaffee,原文連結,原文日期:2018-09-04 譯者:鄭一一;校對:BigNerdCoding,pmst,Forelax;定稿:Forelax 本文是我的設計模式系列教程的第三篇。在第一篇文章中,我介紹了 建立型模式中的工廠模式和單例模式。在第二篇文章中,又討論了一下

單例模式工廠模式代理模式彙總

1.單例模式: 餓漢式 (可用) public class Demo{ private static Demo demo = new Demo(); private Demo(){ } public static Demo getIn

模版方法模式迭代器模式組合模式狀態模式代理模式

1.模版方法模式:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟,還可以提供hook()讓子類決定是否執行某些步驟。比如sort中的Comparable介面。 2.迭代器模式就是集合的迭代器 3.組合模式

HeadFirst 設計模式筆記(七)—— 介面卡模式外觀模式

介面卡模式(Adapter):可以想想現實生活中的轉換插頭。介面卡是一箇中間層,能將類的介面轉換成想要的介面。這與前文中的裝飾者模式有點像,不過裝飾者模式是賦予介面新的功能,而介面卡模式則把介面轉換成需要的樣子。 我的理解比較簡單:假設我們手頭有兩個介面A和B。有一個

java設計模式淺談(單例模式模板模式工廠模式代理模式

這篇文章講述的是java設計模式,包括單例模式、工廠模式、代理模式,如有錯誤或不當之處,希望各位大神批評指正。 什麼是設計模式? 設計模式:是指在大量的理論和實踐中總結和理論化之後,優選的程式碼結構、程式設計風格、以及解決問題的思考模式。正如數學中的公

快速理解單例模式工廠模式代理模式三大模式

1.單例模式單例模式下,單例類只有一個,全域性內都可以直接呼叫靜態方法獲取到該單例的本體,然後呼叫該單例下的方法屬性2.工廠模式有一個工廠類,它負責幫你去快速生成指定的類,比如說,工廠有生產輪子,生產門,生產窗的三條流水線,你只需要告訴我你要生產輪子,工廠就幫你生產輪子到你手

設計模式-門面模式介面卡模式

//門面模式 var DED = window.DED || {} DED.util = { stopPropagation:function(e){ if(e.stopPropagation){ //w3 interface e.stopPropagat

Tomcat 系統架構設計模式第 2 部分: 設計模式分析

門面設計模式在 Tomcat 中有多處使用,在 Request 和 Response 物件封裝中、Standard Wrapper 到 ServletConfig 封裝中、ApplicationContext 到 ServletContext 封裝中等都用到了這種設計模式

C++的多型介面卡模式

       原創文章,轉載請註明出處,謝謝!               作者:清林,部落格名:飛空靜渡 我們知道,c++的多型可以為不同的實現提供同一個介面,介面卡模式也可以讓同一介面得到不同的實現。下面我們通過一個例子來說明這兩個東東 :) 假設,我要設計一套對磁

設計模式-策略模式介面卡模式

某移動支付系統(PaySystem)在實現賬戶資金轉入和轉出時需進行身份驗證,該系統為使用者提供了多種身份驗證方式,例如密碼驗證(PasswordValidator)、指紋驗證(FingerprintV

python幾個面試題目:單例模式淺拷貝深拷貝

主要參考git上一篇面試題目,連結如下https://github.com/taizilongxu/interview_python#2-python%E4%B8%AD%E7%9A%84%E5%85%83%E7%B1%BBmetaclass 實現單例模式,對每種方式新增更詳

設計模式學習——設計原則設計模式

設計原則和模式 一、設計原則 1、單一職責原則:就一個類而言,應該僅有一個引起它變化的原因。換句話說,一個類的功能要單一,只做與它有關的事。(android的四大元件) 2、開放封閉原則:一個軟體實體應該對外擴充套件開放,對修改封閉。對擴充套件開放意味著有新的需求或變化時,可以對現有程式

JDBC-連線池之裝飾和動態代理

前言 通過裝飾者模式來定義連線池 定義Connection實現 定義DataSource實現的實現 通過動態代理來定義連線池

設計模式(三):介面卡模式

介紹 意圖:將類的介面轉換為客戶期望的另一個介面。介面卡模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。是作為兩個不相容的介面之間的橋樑。 主要解決:主要解決在軟體系統中,常常要將一些"現存的物件"放到新的環境中,而新環境要求的介面是現物件不能滿足的。 何時使用: 1、系統需要使用現有的類,而此

嵌入式Linux網路程式設計I/O多路複用阻塞I/O模式非阻塞I/O模式fcntl()/ioctl()多路複用I/O select()/pselect()/poll()訊號驅動I/O

文章目錄 1,I/O模型 2,阻塞I/O 模式 2.1,讀阻塞(以read函式為例) 2.2,寫阻塞 3,非阻塞模式I/O 3.1,非阻塞模式的實現(fcntl()函式、ioctl() 函式)

大資料之Spark(八)--- Spark閉包處理Spark的應用的部署模式Spark叢集的模式啟動Spark On Yarn模式Spark的高可用配置

一、Spark閉包處理 ------------------------------------------------------------ RDD,resilient distributed dataset,彈性(容錯)分散式資料集。 分割槽列表,fun

JAVA設計模式(6):介面卡模式

介面卡模式作為兩個不相容介面之間的橋樑。 這種型別的設計模式屬於結構模式,因為該模式組合了兩個獨立介面。這種模式涉及一個單獨的類,它負責連線獨立或不相容介面的功能。 現實生活的例子- 讀卡器,其作用為儲存卡和膝上型電腦之間的介面卡。將儲存卡插入讀卡器並將讀卡器插入膝上型電腦介面,以便可以通過