这是装饰器模式的一个例子(向对象添加数据)吗?

时间:2012-12-24 23:09:30

标签: design-patterns decorator

我需要向对象添加其他数据 - 但我不需要添加功能。因此以下是经典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;
    }
}

2 个答案:

答案 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。根据语法,它可能都是)

相关问题