2012-07-09 115 views
1

代理 - 哪些代碼(以及哪裏)將ProxyService轉換爲RealService調用?爲什麼/何時使用這個? 圖層 - 如何實現? 紀念品 - 爲什麼不把狀態持久化到緩存或文件?代理和記憶模式

我的代理模式的理解是,你有某種Service接口,具有ProxyServiceRealService結核。出於某種原因,您無法訪問RealService,因此您需要針對ProxyService實例進行編碼,然後讓框架將代理鏈接到您的服務的實際實例。只有兩個問題:

  • 我想不出一個簡單的例子,當我將有機會獲得ServiceProxyService,但不RealService - 有人可以提供範例何時這可能發生嗎?

這與Memento圖案有何不同?我對Memento定義的理解是,它用於保存一個對象狀態,這是代理真正在做的事情,是的?如果沒有,請解釋Memento與代理服務器的不同之處!提前致謝!

回答

2

首先,我會告訴我的答案是,我不相信有任何關於模式的硬性規定 - 你從他們那裏拿走你所需要的東西,除此之外別無他途。我使用某些模式的方式無疑與其他開發人員選擇使用它們的方式不同。這就是說,這是我對你的問題的看法。

代理模式解釋

我知道Proxy設計模式的方式,你用它做兩件事情:

  1. 限制訪問特定的對象實例,否則公共方法
  2. 通過在第一次調用代理時實例化具體對象,然後將代理上的所有進一步調用傳遞給具體實例的代理創建,從而避免成本高昂且不必要的實例化成本編輯。

也許RealService有一個你想隱藏的方法doSomethingReallyDangerous()。或者甚至更無害,也許RealService有幾百種方法,每次在RealService實例的變量名稱後輸入.時都不需要查看。你可以使用任何一個代理。

對於進一步閱讀,這篇文章有很多很好的信息:

http://sourcemaking.com/design_patterns/proxy

差異與備忘錄模式

Memento模式允許你的對象回滾到原來的狀態或者一些以前的狀態,通過將中間狀態存儲在具體對象的旁邊。有點像編程的「撤銷」。您可能會使用Proxy模式來實現Memento,但Proxy不保證保存對象狀態或回滾 - 它只是讓您爲方法調用引用同一個對象,如果再次實例化該對象的代價非常昂貴。

所以希望幫助 - 我喜歡把Memento作爲Proxy更全功能版本,但不是所有的Proxy實現是Mementos

2

代理是當有人希望某個對象,你騙他,你說:是的,在這裏你有你的對象,但你實際上是給他別的東西... 常見的用途爲代理: 要實現懶惰初始化:要求您提供一個表示大文件內容的對象,或者需要昂貴的對象,並且您知道在這個正確的時刻它不是必需的,或者它實際上可能永遠不會被真正使用。所以你通過一個代理,它只會在100%完全需要的時候獲得資源(你也可以開始不合時宜地獲取資源,並使得使用代理的進程只在真正需要時纔開始等待)。這在ORM中很常見。也futures and promises實現這樣的事情 要攔截調用: 您可以傳遞一個實際上知道真實對象的代理,並攔截它獲取的調用,並執行一些有趣的事情,比如記錄它們,更改其中的一些,等等...... 由於您經常有能力確定運行時的行爲,因此代理的許多先進和複雜的用法。抱歉離開Java,但在C#中,Castle Proxy用於實現模擬對象進行測試。您也可以使用代理服務來實現諸如chaining in underscore。你可以使用代理模擬很多靜態語言的「動態語言」功能。您也可以使用代理來評估一段代碼,該代理實際記錄每次創建的調用,並且每次都返回新的代理,通過執行它來重建「原始源代碼」。

紀念圖案:完全是另一回事。當你想要使用一個對象時,你可以使用它,保存它當前的狀態,用這個對象來計數,然後過一段時間你可能想要選擇回滾到前一個狀態。你可以用它來實現你的對象中的事務行爲,當通過代碼撤銷事情是困難的。您可以使用此功能實現撤消&重做功能。 (而不是保存改變三角洲,你保存完整的狀態)。您可以在模擬中使用它,以便每次從同一點開始(可以說源版本服務器每隔一段時間使用一次記憶[它們通常使用記憶+增量變化的組合])。虛擬機的快照或計算機的休眠也是使用備忘錄模式。並保存一些東西的狀態,所以你可以再現完全相同的情況也是紀念。