这个设计模式有名称吗(动态环绕另一个class)?

Is there a name for this design pattern (dynamically wrapping around another class)?

假设我有一个 class uicontrolWrapper,它是 uicontrol 的包装器(但不子 class 它)。 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 而不是 "reaching into" 我们正在尝试调整的 属性。

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

我相信你在这里问的是 Proxy 设计模式(通过创建包装器 class 作为代理来提供到其他对象的接口)。

它的几个好处是添加安全访问并简化包装对象的 API(代理可以提供一个简单的 API,这样客户端代码就不必处理感兴趣对象的复杂性)。

这是 Decorator Pattern -- 创建一个工具,将新功能装饰到现有对象上(可能在许多不同的时间),特别是在不影响相同类型的任何其他实例(或以显式方式影响它们)的情况下如果需要)。

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