Reputation: 8720
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
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
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