Robben_Ford_Fan_boy
Robben_Ford_Fan_boy

Reputation: 8720

Is this an example of the Decorator Pattern (adding data to object)?

I need to add additional data to an object - but I don't need to add functionality. therefore is the following an example of the classic GOF Decorator Pattern?

class ClassIWantToDecorate
{
    public string GetData() { return "data"; }
}

class Decorator
{
    private ClassIWantToDecorate _classIWantToDecInstance = null;
    private string _additionalData;
    public Decorator(ClassIWantToDecorate classIWantToDec, string additionalData)
    {
        _classIWantToDecInstance = classIWantToDec;
        _additionalData = additionalData;
    }

    public string DataINeed()
    {
        return _classIWantToDecInstance.GetData();
    }

    public string AdditionalDataINeed()
    {
        return _additionalData;
    }
}

Upvotes: 0

Views: 598

Answers (2)

micha
micha

Reputation: 49582

The problem with your implementation is that your decorator interface is not compatible to the interface of the decorated object.

A valid decorator solution would be:

interface ClassIWantToDecorateInterface {
  public string GetData();
}

class ClassIWantToDecorate implements ClassIWantToDecorateInterface {
    public string GetData() { return "data"; }
}

class Decorator implements ClassIWantToDecorateInterface {
    private ClassIWantToDecorateInterface _classIWantToDecInstance = null;
    private string _additionalData;
    public Decorator(ClassIWantToDecorateInterface classIWantToDec, string additionalData)
    {
        _classIWantToDecInstance = classIWantToDec;
        _additionalData = additionalData;
    }

    public string GetData() {
        return _classIWantToDecInstance.GetData();
    }

    public string AdditionalDataINeed() {
        return _additionalData;
    }
}

(I used java syntax because I wasn't sure you are using C# or Java. According to the syntax it could be both)

Upvotes: 1

JB Nizet
JB Nizet

Reputation: 691795

No. I would say that it's just composition.

A decorator would be something like this:

interface DataINeedProvider {
    string DataINeed();
}

class LoggingDecorator implements DataINeedProvider
{
    private DataINeedProvider _classIWantToDecInstance = null;
    private Logger logger = new Logger();
    public LoggingDecorator(DataINeedProvider classIWantToDec) {
        _classIWantToDecInstance = classIWantToDec;
    }

    public string DataINeed()
    {
        logger.log("DataINeed has been called");
        return _classIWantToDecInstance.DataINeed();
    }
}

PS: sorry if this is not valid C# syntax. I'm a Java developer.

Upvotes: 2

Related Questions