2015-02-23 7 views
6

Angenommen, ich habe eine Klasse uicontrolWrapper, die ein Wrapper für eine uicontrol ist (aber keine Unterklasse). Das uicontrol Zeug ist in einem Privatbesitz für uicontrolWrapper gehalten. Grundsätzlich möchte ich set/get gegen den Wrapper tun können, und Anrufe würden in uicontrol eingegeben werden.Gibt es einen Namen für dieses Entwurfsmuster (dynamisch um eine andere Klasse wickeln)?

konnte ich dies tun:

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 

, aber ich mag diese hartzucodieren offensichtlich ziemlich hässlich ist.

Oder ich dynamically generate properties dependent on what I'm trying to wrap tun könnte:

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 

Der springende Punkt ist die Law of Demeter durch nicht „erreicht in“ Eigentum zu vermeiden, verletzen wir anzupassen versuchen.

Ich weiß nicht, ob dies ein Design-Muster ist, aber ich habe diese Art der Sache verwendet, um Objekte verschiedener Typen zu umhüllen, wenn das Unterklassen-Unterfangen aus irgendeinem Grund unpassend ist. (Zum Beispiel ist die matlab.ui.control.UIControl Klasse Sealed und kann nicht unterklassifiziert werden.) Hat diese einen tatsächlichen Namen und beabsichtigte typische Verwendung?

+0

Art erinnert mich an die [Decorator] (http://www.oodedesign.com/decorator-pattern.html). Es gibt Ihnen grundsätzlich die Möglichkeit, der erweiterten Klasse Funktionalität hinzuzufügen. Nicht sicher, ob das dein Fall ist. Ich habe Matlab noch nie zuvor gesehen, daher ist es etwas verwirrend für mich zu lesen. – Bono

+0

Warum der Downvote? Ich würde gerne bearbeiten, um diese Frage besser zu machen. –

+1

War ich nicht. Ich habe gegen den Downvote aufgestanden, weil es für mich eine klare Frage ist. – Bono

Antwort

3

Dies ist die Decorator Pattern - Erstellen eines Werkzeugs, das neue Funktionalität auf vorhandenen Objekten (zu möglicherweise vielen verschiedenen Zeiten) speziell ohne Beeinflussung anderer Instanzen des gleichen Typs (oder auf explizite Weise, wenn gewünscht) beeinflusst.

Dies unterscheidet sich von Proxy-Muster in dem Sinne, dass Sie nicht die Aufgabe des Absenden der richtigen Operation auf den Proxy verzögern, sind Sie tatsächlich neue Funktionalität auf das Objekt verpflanzen.

+0

In Lesen auf das Muster scheint die Decorator-Klasse von der zu dekorierenden Klasse zu stammen. Ist das notwendig und wenn ja, warum? (Mein 'uicontrolWrapper' baut keine 'uicontrol' ab, sondern behält es als Eigenschaft bei.) –

+0

Es ist nicht notwendig, zum Beispiel herauszufinden, wie das Dekoratormuster in Python funktioniert. – ely

1

Ich glaube, dass Sie hier nach dem Proxy Entwurfsmuster fragen (stellen Sie eine Schnittstelle zu anderen Objekten her, indem Sie eine Wrapper-Klasse als Proxy erstellen).

Ein paar seiner Vorteile sind das Hinzufügen von Sicherheitszugriff und das Vereinfachen der API für das Wrapped-Objekt (der Proxy kann eine einfache API bereitstellen, sodass der Clientcode nicht mit der Komplexität des Objekts von Interesse umgehen muss).

+0

Down-Wähler zu erklären? – Jeb

+0

Es ist nicht Proxy-Muster, es ist Dekorateur Muster. Proxy verwaltet eine Dispatcher-Schnittstelle, nicht die Dekoration neuer Funktionen, die * auf * etwas gepfropft sind. – ely

+0

Ja, aber alles, was ein Decorator ist, ist ein "intelligenter" Proxy, also kann das OP bei Bedarf einfach Erweiterungen hinzufügen. Die Basis ist ein Proxy/Delegat – Jeb

Verwandte Themen