我需要向对象添加其他数据 - 但我不需要添加功能。因此以下是经典GOF装饰模式的一个例子?
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;
}
}
答案 0 :(得分:2)
没有。我会说它只是composition。
装饰师会是这样的:
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:对不起,如果这是无效的C#语法。我是一名Java开发人员。
答案 1 :(得分:1)
您的实现问题是您的装饰器界面与装饰对象的界面不兼容。
有效的装饰解决方案是:
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;
}
}
(我使用java语法,因为我不确定你是使用C#还是Java。根据语法,它可能都是)