2015-02-23 26 views
6

假設我有一個uicontrolWrapper類,它是uicontrol(但不包含它的子類)的包裝。 uicontrol的東西保存在uicontrolWrapper的私人財產。基本上,我希望能夠對包裝器執行set/get,並且調用將輸入uicontrol是否有這個設計模式的名稱(動態環繞另一個類)?

我可以這樣做:

classdef uicontrolWrapper < handle 
    properties (Access = private) 
     uic 
    end 
    properties (Dependent) 
     Style 
     String 
     Value 
     ... 
    end 
    methods 
     function set.Style(obj, val) 
      obj.uic.Style = val; 
     end 
     function val = get.Style(obj) 
      val = obj.uic.Style; 
     end 
     ... 
    end 

但硬編碼像這顯然是很醜陋。

或者,我可以做dynamically generate properties dependent on what I'm trying to wrap

classdef uicontrolWrapper < dynamicprops 
    properties (Access = private) 
     uic 
    end 
    methods 
     function obj = uicontrolWrapper(hObj) 
      obj.uic = hObj; 
      cellfun(@(prop) obj.createProperty(prop, fields(get(hObj)); 
     end 
     function createProperty(obj, prop) 
      p = addprop(obj, prop); 
      p.Dependent = true; 
      p.SetMethod = @setUicontrolProp; 
      p.GetMethod = @getUicontrolProp; 

      function setUicontrolProp(obj, val) 
       obj.uic.(prop) = value; 
      end 
      function val = getUicontrolProp(obj) 
       val = obj.uic.(prop); 
      end 
     end 
    end 
end 

整點是,以避免不「深入到」物業我們正在努力調整違反Law of Demeter

我不知道這是否是一種設計模式,但是當子類出於某種原因或其他不適當的原因使用這種類型的東西來包裝不同類型的對象時。 (例如,matlab.ui.control.UIControl類是Sealed,不能被分類。)這是否有實際名稱和預期的典型用途?

+0

有點讓我想起[Decorator](http://www.oodesign.com/decorator-pattern.html)。它基本上爲您提供了向擴展類添加功能的可能性。不知道這是你的情況。之前從來沒有見過matlab,所以這對我來說是一種混淆。 – Bono 2015-02-23 14:30:46

+0

爲什麼downvote?我很樂意編輯以更好地解決這個問題。 – 2015-02-23 14:33:42

+1

不是我。我贊成反對,因爲這對我來說似乎是個很明確的問題。 – Bono 2015-02-23 14:34:59

回答

3

這是Decorator Pattern - 創建一個工具,可以在不影響同一類型的任何其他實例(或者如果需要時以明確的方式影響它們)的情況下在現有對象(可能在多個不同時間)上裝飾新功能。

這與代理模式有所不同,因爲您並不推遲將正確操作分配給代理的任務,您實際上將新功能嫁接到對象上。

+0

在閱讀模式,似乎Decorator類繼承了正在裝飾的類。這是否有必要,如果是這樣,爲什麼? (例如,我的'uicontrolWrapper'不是uicontrol的子類,只是將它保留爲一個屬性。) – 2015-02-23 15:14:28

+0

沒有必要,例如檢查裝飾器模式在Python中的工作方式。 – ely 2015-02-23 15:17:09

1

我相信你在問這裏的Proxy設計模式(通過創建一個包裝類作爲代理來爲其他對象提供一個接口)。

它的一些好處是增加了安全訪問並簡化了包裝對象的API(代理可以提供一個簡單的API,以便客戶端代碼不必處理感興趣對象的複雜性)。

+0

低調選民照顧解釋? – Jeb 2015-02-23 14:30:31

+0

它不是代理模式,它是裝飾模式。代理管理調度接口,而不是將新功能嫁接到*東西上。 – ely 2015-02-23 14:31:27

+0

是的,但所有裝飾器都是「智能」代理,所以如果需要,OP可以在其上添加擴展。基礎是代理人/代理人 – Jeb 2015-02-23 14:33:57

相關問題