1. 程式人生 > >每日設計模式——代理模式和裝飾器模式的區別

每日設計模式——代理模式和裝飾器模式的區別

代理模式和裝飾器模式的區別

首先我們對比一下代理模式和裝飾器模式的類圖結構:

代理模式:

這兩個設計模式看起來很像。對裝飾器模式來說,裝飾者(Decorator)和被裝飾者(ConcreateComponnet)都實現同一個 介面。對代理模式來說,代理類(ProxySubject)和真實處理的類(RealSubject)都實現同一個介面。此外,不論我們使用哪一個模式,都可以很容易地在真實物件的方法前面或者後面加上自定義的方法。

 然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。裝飾器模式關注於在一個物件上動態的新增方法,然而代理模式關注於控制對物件的訪問。換句話 說,用代理模式,代理類(ProxySubject)可以對它的客戶隱藏一個物件的具體資訊。因此,當使用代理模式的時候,我們常常在一個代理類中建立一個物件的例項。並且,當我們使用裝飾器模式的時候,我們通常的做法是將原始物件作為一個引數傳給裝飾者的構造器。

        我們可以用另外一句話來總結這些差別:使用代理模式,代理和真實物件之間的的關係通常在編譯時就已經確定了,而裝飾者能夠在執行時遞迴地被構造。裝飾器模式強調的是對被裝飾物件功能的增強,而代理模式更多的是強調對被代理物件行為的限制(可以是限制執行或者也可以是增強,如許可權檢查控制和日誌功能增強)