0

オブジェクトにデータを追加する必要がありますが、機能を追加する必要はありません。したがって、次は古典的な 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;
    }
}
4

2 に答える 2

2

いいえ、ただの構成だと思います。

デコレータは次のようになります。

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 開発者です。

于 2012-12-24T23:22:28.070 に答える
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;
    }
}

(C#またはJavaを使用しているかどうかわからなかったので、Java構文を使用しました。構文によれば、両方である可能性があります)

于 2012-12-24T23:23:14.373 に答える