2015-02-23 17 views
6

Supponiamo di avere una classe uicontrolWrapper, che è un wrapper per un uicontrol (ma non la sottoclasse). Il materiale uicontrol è conservato in una proprietà privata per uicontrolWrapper. Fondamentalmente, voglio essere in grado di fare set/get contro il wrapper, e le chiamate si alimentano in uicontrol.Esiste un nome per questo motivo di progettazione (che si avvolge dinamicamente attorno ad un'altra classe)?

avrei potuto fare questo:

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 

ma hardcoding come questo è, ovviamente, piuttosto brutto.

Oppure, potrei fare 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 

Il punto è quello di evitare di violare il Law of Demeter da non "raggiungendo in" la proprietà che stiamo cercando di modificare.

Non so se questo è un motivo di progettazione, ma ho usato questo tipo di cose per avvolgere oggetti di diverso tipo quando la sottoclasse è per qualche motivo o un altro inappropriato. (Ad esempio, la classe matlab.ui.control.UIControl è Sealed e non può essere sottoclasse.) Ha un nome effettivo e un uso tipico previsto?

+0

Tipo di mi ricorda il [Decoratore] (http://www.oodesign.com/decorator-pattern.html). In pratica ti dà la possibilità di aggiungere funzionalità alla classe estesa. Non sono sicuro se questo è il tuo caso però. Mai visto prima MATLAB, quindi è un po 'di confusione da leggere per me. – Bono

+0

perché il downvote? Sarei felice di modificare per rendere questa domanda migliore. –

+1

Non ero io. Ho svalutato il downvote, perché mi sembra una buona domanda chiara. – Bono

risposta

3

Questo è il Decorator Pattern - creazione di uno strumento che decora le nuove funzionalità su oggetti esistenti (a volte anche diverse volte) in particolare senza influire su altre istanze dello stesso tipo (o su di esse in modo esplicito se desiderato).

Questo differisce dal motivo Proxy nel senso che non si rinvia l'operazione di invio dell'operazione corretta al proxy, si sta effettivamente innestando la nuova funzionalità su dell'oggetto.

+0

Nella lettura del pattern , sembra che la classe Decorator erediti dalla classe che viene decorata. È necessario farlo e, in tal caso, perché? (Il mio 'uicontrolWrapper' non sottoclasse' uicontrol', lo mantiene come una proprietà, per esempio.) –

+0

Non è necessario, per esempio controllare come funziona il pattern decorator in Python. – ely

1

Credo che tu stia chiedendo del motivo di progettazione Proxy qui (fornisci un'interfaccia ad altri oggetti creando una classe wrapper come proxy).

Un paio dei suoi vantaggi sono l'aggiunta dell'accesso di sicurezza e la semplificazione dell'API per l'oggetto spostato (il proxy può fornire una semplice API in modo che il codice client non debba occuparsi della complessità dell'oggetto di interesse).

+0

Il down-elettore cura di spiegare? – Jeb

+0

Non è un modello proxy, è un motivo decoratore. Proxy gestisce un'interfaccia di dispacciamento, non la decorazione di nuove funzionalità innestate * su * qualcosa. – ely

+0

Sì, ma tutto ciò che un decoratore è un proxy "intelligente", quindi se necessario l'OP può semplicemente aggiungere estensioni. La base è un proxy/delegato – Jeb

Problemi correlati