这个设计模式是否有名称(动态环绕另一个类)?

Dan*_*hoa 6 oop matlab design-patterns

假设我有一个类uicontrolWrapper,它是a的包装器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
Run Code Online (Sandbox Code Playgroud)

但像这样的硬编码显然非常难看.

或者,我可以根据我想要包装的内容动态生成属性:

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
Run Code Online (Sandbox Code Playgroud)

重点是避免违反"得墨忒耳法则"而不是"触及"我们试图调整的财产.

我不知道这是否是一个设计模式,但是当子类化由于某种原因或另一个不合适时,我已经使用这种类型的东西来包装不同类型的对象.(例如,matlab.ui.control.UIControl该类是Sealed并且不能被子类化.)这是否具有实际名称和预期的典型用途?

ely*_*ely 3

这就是装饰器模式——创建一个工具,专门将新功能装饰到现有对象上(可能在许多不同的时间),而不影响任何其他相同类型的实例(或者如果需要,以显式方式影响它们)。

这与代理模式的不同之处在于,您没有推迟向代理分派正确操作的任务,而是实际上将新功能移植对象上。