假设我有一个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
,不能被分类。)这是否有实际名称和预期的典型用途?
有点让我想起[Decorator](http://www.oodesign.com/decorator-pattern.html)。它基本上为您提供了向扩展类添加功能的可能性。不知道这是你的情况。之前从来没有见过matlab,所以这对我来说是一种混淆。 – Bono 2015-02-23 14:30:46
为什么downvote?我很乐意编辑以更好地解决这个问题。 – 2015-02-23 14:33:42
不是我。我赞成反对,因为这对我来说似乎是个很明确的问题。 – Bono 2015-02-23 14:34:59