C# 装饰者模式:如何从装饰对象中提取额外的责任?

C# 装饰者模式:如何从装饰对象中提取额外的责任?,c#,design-patterns,decorator,C#,Design Patterns,Decorator,我的应用程序中有一个sheet类: class Sheet { Public int[] RatioIDs{get;set;} Public int[] PartnerIDs{get;set;} } 此sheet类在运行时创建和存储了数千个实例,但是,当我处理它们时,最多只能处理5个sheet对象。只有在处理sheet对象之前,我才使用其他属性和方法对其进行修饰,以避免开销: //假设我已经用以下额外的职责装饰了sheet对象 class DecoratedSheet { //Th

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

 class  Sheet
{
  Public int[] RatioIDs{get;set;}
  Public int[] PartnerIDs{get;set;}
}
此sheet类在运行时创建和存储了数千个实例,但是,当我处理它们时,最多只能处理5个sheet对象。只有在处理sheet对象之前,我才使用其他属性和方法对其进行修饰,以避免开销:

//假设我已经用以下额外的职责装饰了sheet对象

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个伙伴的数组)。因此,我不知道如何撤销附加到这个装饰过的表单对象的额外责任。我该怎么做

您想保留对象的装饰状态,还是只想获取处于原始状态的原始对象?decorator的概念是,您拥有一个具有最小属性的基本对象,并在运行时添加到该对象中。在这种情况下,我不知道decorator是什么-您没有在代码中指定它。合伙人是床单的装饰师吗?实际的“表”对象在哪里起作用?DecoratedSheet获取一个Partner对象并将其存储在一个Partner数组中,但是Sheet在哪里发挥作用呢

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

我希望这有帮助

wiki页面有一个很好的例子:

课程表:IShetwithPartners{
公共IEnumerable比率类{get;set;}
公共IEnumerable partnerId{get;set;}
公共IEnumerable伙伴{get;set;}
公共双GetRatioAmountForPartner(合作伙伴){
//你的代码在这里
}
}
接口ISHET{
IEnumerable ratiods{get;}
IEnumerable partnerId{get;}
}
接口ISheetWithPartners:ISheet{
IEnumerable Partners{get;}
双GetRatioAmountForPartner(合作伙伴);
}

然后您可以处理接口。比创建.GetBase()之类的函数更容易,你是说要处理
参数
数组?
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);
}