【问题标题】:Decorator Pattern : How to withdraw additional responsibilities from a decorated object ?装饰者模式:如何从被装饰的对象中撤回额外的职责?
【发布时间】:2014-04-09 02:32:19
【问题描述】:

我的应用程序中有一个工作表类:

 class  Sheet
{
  Public int[] RatioIDs{get;set;}
  Public int[] PartnerIDs{get;set;}
}

这个工作表类在运行时创建和存储了数千个实例,但是当我处理它们时,我将使用最多 5 个工作表对象。只有在处理工作表对象之前,我才使用其他属性和方法来装饰它以避免开销:

//假设我已经用以下额外的职责装饰了工作表对象。

class DecoratedSheet
{
//There would be like 100 partner object in this array.
//and these partners are fetched based on partnerIDs array in sheet object
 Public Partner[] Partners;

public double GetRatioAmountForPartner(Partner partner)
{
  //Get ratio amount, its calculation would be based on
 //RatioID array in sheet object for a given partner.
}    

}

完成装饰的工作表对象后,我不需要它的其他属性(尤其是 100 个合作伙伴的数组)。所以我要撤消附加到这个装饰表对象的额外职责。我该怎么做?

【问题讨论】:

  • 你的意思是要处理parners数组?

标签: c# design-patterns decorator


【解决方案1】:
class Sheet : ISheetWithPartners {
    public IEnumerable<int> RatioIDs { get; set; }
    public IEnumerable<int> PartnerIDs { get; set; }
    public IEnumerable<Partner> Partners { get; set; }
    public double GetRatioAmountForPartner(Partner partner) {
        // Your code here
    }
}

interface ISheet {
    IEnumerable<int> RatioIDs { get; }
    IEnumerable<int> PartnerIDs { get; }
}

interface ISheetWithPartners : ISheet {
    IEnumerable<Partner> Partners { get; }
    double GetRatioAmountForPartner(Partner partner);
}

然后你就可以处理接口了。比创建 .GetBase() 之类的函数更容易

【讨论】:

    【解决方案2】:

    您想保留对象的修饰状态还是只想获取原始对象的原始状态?装饰器的想法是您有一个具有最少属性的基础对象,并在运行时添加到它。在这种情况下,我不知道装饰器是什么——你没有在代码中指定它。例如。 Partner 是 Sheet 的装饰器吗?实际的“Sheet”对象在哪里发挥作用? DecoratedSheet 接受一个 Partner 对象并将其存储在一个 Partners 数组中,但是 Sheet 是在哪里发挥作用的呢?

    最简单的方法是实现一个 getComponent() 或 getBase() 方法,该方法从您使用的任何东西中返回一个 Sheet 对象。您创建并添加到原始对象的每个装饰器都可以并且应该可以访问对象的属性,同时包含它们自己的属性,以便您可以随意交换和更改。

    希望对你有帮助。

    维基页面有一个很好的例子: http://en.wikipedia.org/wiki/Decorator_pattern

    【讨论】:

      猜你喜欢
      • 2017-06-11
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      相关资源
      最近更新 更多