【问题标题】:What is the name of this design pattern (exposing private method to collaborator via delegate)?这种设计模式的名称是什么(通过委托向协作者公开私有方法)?
【发布时间】:2010-12-10 05:22:12
【问题描述】:

类通过委托向协作者公开私有方法或属性的设计模式的名称是什么?这是在 C# 中,但也可能与其他语言相关。

例如:

class Foo
{
    public int X
    {
        get;
        private set;
    }

    public void UpdateX(Bar bar)
    {
        bar.UpdateX(x => this.X = x);
    }
}

class Bar
{
    public void UpdateX(Action<int> setter)
    {
        setter(7);
    }
}

Foo foo = new Foo();
Bar bar = new Bar();
foo.UpdateX(bar);

我认为这在状态模式中很有用,它允许状态更新其上下文,而不需要上下文通过其公共接口公开内容,或在上下文类中嵌套状态类。

【问题讨论】:

    标签: c# design-patterns


    【解决方案1】:

    我在这里看不到任何模式,但它打破了封装。

    如果您有一个只读属性,那么为什么要尝试规避它。

    【讨论】:

    • 我认为这里的想法是将另一个对象的状态存储在 Foo 中。当然,这是一个人为的例子。
    • 经过反思,我倾向于同意这个回复。我想这是一个不符合模式的编码习惯。封装中断的原因是客户端代码可能会挂在委托上并在 Update 调用返回后更改属性。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      委托是一种设计模式。

      【讨论】:

        【解决方案4】:

        这与 Memento 模式有惊人的相似之处,确实对于存储和操作状态很有用。

        它还具有依赖注入或委托的元素。

        也许有人比我更能认出它的真名。

        以下是有关 Memento 模式的一些信息:
        Wikipedia: Memento

        以及依赖注入模式:
        Wikipedia: Dependency Injection

        【讨论】:

          【解决方案5】:

          我会以 200 美元的价格购买 Double Dispatch。而且在您进入访问者模式的路上。

          我还认为这不会破坏封装,仅仅是因为 Foo 定义了委托。

          【讨论】:

            猜你喜欢
            • 2014-11-25
            • 1970-01-01
            • 2010-12-18
            • 1970-01-01
            • 2011-02-10
            • 2016-11-16
            • 1970-01-01
            • 1970-01-01
            • 2015-08-01
            相关资源
            最近更新 更多