Search code examples
c#design-patternsdecorator

Decorator Design Pattern - Example


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--

Solution

  • 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++