2015-02-23 28 views
6

假设我有一个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,不能被分类。)这是否有实际名称和预期的典型用途?

+0

有点让我想起[Decorator](http://www.oodesign.com/decorator-pattern.html)。它基本上为您提供了向扩展类添加功能的可能性。不知道这是你的情况。之前从来没有见过matlab,所以这对我来说是一种混淆。 – Bono 2015-02-23 14:30:46

+0

为什么downvote?我很乐意编辑以更好地解决这个问题。 – 2015-02-23 14:33:42

+1

不是我。我赞成反对,因为这对我来说似乎是个很明确的问题。 – Bono 2015-02-23 14:34:59

回答

3

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

这与代理模式有所不同,因为您并不推迟将正确操作分配给代理的任务,您实际上将新功能嫁接到对象上。

+0

在阅读模式,似乎Decorator类继承了正在装饰的类。这是否有必要,如果是这样,为什么? (例如,我的'uicontrolWrapper'不是uicontrol的子类,只是将它保留为一个属性。) – 2015-02-23 15:14:28

+0

没有必要,例如检查装饰器模式在Python中的工作方式。 – ely 2015-02-23 15:17:09

1

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

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

+0

低调选民照顾解释? – Jeb 2015-02-23 14:30:31

+0

它不是代理模式,它是装饰模式。代理管理调度接口,而不是将新功能嫁接到*东西上。 – ely 2015-02-23 14:31:27

+0

是的,但所有装饰器都是“智能”代理,所以如果需要,OP可以在其上添加扩展。基础是代理人/代理人 – Jeb 2015-02-23 14:33:57

相关问题