装饰模式:如何从装饰对象中撤回其他职责?

时间:2014-04-09 02:32:19

标签: c# design-patterns decorator

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

 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个合作伙伴的数组)。所以我要撤消附加到这个装饰的工作表对象的附加职责。我该怎么办?

2 个答案:

答案 0 :(得分: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()或其他

之类的函数更容易

答案 1 :(得分:0)

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

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

我希望有所帮助。

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