装饰器模式 - 从装饰器访问包装对象中的值

本文关键字:对象 模式 访问 包装 | 更新日期: 2023-09-27 18:33:00

我有一个关于装饰器模式的问题

假设我有这段代码

interface IThingy 
{
    void Execute(); 
}
internal class Thing : IThingy
{
    public readonly string CanSeeThisValue;
    public Thing(string canSeeThisValue)
    {
        CanSeeThisValue = canSeeThisValue;
    }
    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}
class Aaa : IThingy 
{
    private readonly IThingy thingy;
    public Aaa(IThingy thingy)
    {
        this.thingy = thingy;
    }
    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}

class Bbb : IThingy {
    private readonly IThingy thingy;
    public Bbb(IThingy thingy)
    {
        this.thingy = thingy;
    }
    public void Execute()
    {
        throw new System.NotImplementedException();
    } 
}
class Runit {
    void Main()
    {
        Aaa a = new Aaa(new Bbb(new Thing("Can this be accessed in decorators?")));
    } 
}

我们有一个名为 thing 的类,它由两个装饰器 Aaa 和 bbb 包装

如何最好地从 Aaa 或 bbb 访问字符串值"CanSeeThisValue"(在事物中)

我试图为它们创建一个基类,但是当然,虽然它们共享相同的基,但它们不共享相同的基数实例

我是否需要将值传递给每个构造函数?

装饰器模式 - 从装饰器访问包装对象中的值

装饰器将功能添加到它们正在包装的项目的公共接口中。 如果你想让你的装饰器访问不属于IThingyThing的成员,那么你应该考虑装饰器是否应该包装Thing而不是IThingy

或者,如果所有IThingy都应该具有 CanSeeThisValue 属性,则通过添加(和实现)该属性作为属性,使该属性也成为IThingy接口的一部分。

interface IThingy 
{
    string CanSeeThisValue { get; }
    void Execute(); 
}

这将使Thing看起来像:

internal class Thing : IThingy
{
    public string CanSeeThisValue { get; private set; }
    public Thing(string canSeeThisValue)
    {
        CanSeeThisValue = canSeeThisValue;
    }
    ...
}