装饰图案:如何从装饰的物体中提取额外的责任

本文关键字:提取 责任 | 更新日期: 2023-09-27 17:57:26

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

 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个伙伴的数组)。所以我要收回附加在这个装饰床单上的额外责任。我该怎么做??

装饰图案:如何从装饰的物体中提取额外的责任

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()或任何等函数更容易

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

最简单的方法是实现一个getComponent()或getBase()方法,该方法从您正在装饰的对象中返回一个Sheet对象。您创建并添加到原始对象的每个装饰器都可以也应该访问对象的属性,同时包含它们自己的属性,这样您就可以随心所欲地交换和更改。

我希望这能有所帮助。

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