I am trying to understand Decorator Design Pattern.
Wonder what is the best way to decorate fields values in below example?
Am I using decorator pattern correctly? If not how can I improve it?
public class Fields
{
string InvoiceNumber {get;set;}
DateTime InvoiceDate {get;set;}
DateTime DueDate {get;set;}
string ReferenceNumber {get;set;}
string OrganisationNumber {get;set;}
}
Fields fields = new Fields();
fields.InvoiceNumber = "1234";
Decorator1 decorator1 = new Decorator1(fields);
decorator1.Decorate(fields.InvoiceNumber);
Console.Write(fields.InvoiceNumber); //it changes InvoiceNumber to 1234++
Decorator2 decorator2 = new Decorator2(fields);
decorator2.Decorate(fields.InvoiceNumber);
Console.Write(fields.InvoiceNumber); //it changes InvoiceNumber to 1234--
My take on a similar decorator pattern would be something like this:
public interface IFields
{
string InvoiceNumber {get;set;}
}
public class Fields : IFields
{
string InvoiceNumber {get;set;}
// Let's dumb it down to one Field for brevity
}
public class FieldsPlusDecorator : IFields
{
public static IFields Decorate(IFields decoratee) => new FieldsPlusDecorator (decoratee);
private readonly IFields _subject:
private FieldsPlusDecorator (IFields subject) => _subject = subject;
public string InvoiceNumber
{
get { return $"{subject.InvoiceNumber}++"; }
set { throw new NotSupportedException(); } // Again: For Brevity, maybe just write-through ...
}
}
Usage:
IFields myFields = new Fields(){ InvoiceNumber = "1234" };
Console.WriteLine(myFields.InvoiceNumber); // 1234
myFields = FieldsPlusDecorator.Decorate(myFields);
Console.WriteLine(myFields.InvoiceNumber); // 1234++