首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是装饰者模式(将数据添加到对象)的一个示例吗?

这是装饰者模式(将数据添加到对象)的一个示例吗?
EN

Stack Overflow用户
提问于 2012-12-25 07:09:30
回答 2查看 530关注 0票数 0

我需要向对象添加额外的数据-但我不需要添加功能。因此,下面的示例是经典的GOF Decorator模式吗?

代码语言:javascript
复制
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;
    }
}
EN

回答 2

Stack Overflow用户

发布于 2012-12-25 07:22:28

不是的。我会说这只是composition

装饰器应该是这样的:

代码语言:javascript
复制
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开发人员。

票数 2
EN

Stack Overflow用户

发布于 2012-12-25 07:23:14

您的实现的问题是您的装饰器接口与装饰器对象的接口不兼容。

有效的装饰器解决方案应该是:

代码语言:javascript
复制
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。根据语法,它可以是两者都是)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14026380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档