什么是“关闭”类实例的正确设计模式?

时间:2017-07-17 21:04:17

标签: c# .net oop design-patterns

假设我有一个带有一堆方法的类,如果配置文件中的标志被关闭,我希望这些方法基本上没有操作。 。应该遵循什么类型的设计模式?我曾想过像有条件运行方法这样的hacky(例如Can I conditionally control method calls at runtime with attributes?)。

3 个答案:

答案 0 :(得分:1)

假设介于两者之间,可以在这种情况下用虚拟替换实现。喜欢

interface IFoo
    void DoBla()

class DummyFoo : IFoo
    void DoBla() {}

class RealFoo : IFoo
    void DoBla() {
        [some actual code]
    }

答案 1 :(得分:0)

让我们保持简单。没有模式和所有过度思考恕我直言。如果你不希望方法在标志关闭时执行任何操作,则不应该调用方法本身。

IF Config.Flag = OFF
    DoNothing();
ELSE
    CallMethod();

Vs以上。

CallMethod() {
    IF Config.Flag = OFF
        DoNothing();
    ELSE
        DoSomething();
}

我在第一个投票的原因是因为您的代码的读者知道正在发生什么以及配置标志的重要性。在后一种情况下,如果他们不了解旗帜,他们可能会发生一些事情发生,并在没有任何反应时感到困惑。

答案 2 :(得分:0)

实现此类功能的一种相对轻松的方法是使用null条件运算符来使用委托调用。

定义给定方法的代理:

private Action ConditionalSomeMethod;
private Action<string> ConditionalSomeMethod2;

private void SomeMethod() { }
private void SomeMethod2(String arg) {Console.WriteLine(arg);}

然后根据您的情况分配代表。

private void SetupConditionalMethods()
{
    bool runConditionals = true;
    if (runConditionals)
    {
        ConditionalSomeMethod = SomeMethod;
        ConditionalSomeMethod2 = SomeMethod2;
    }
    else
    {
        ConditionalSomeMethod = null;
        ConditionalSomeMethod2 = null;
    }
}

使用空条件运算符的示例用法。

private void DemoIt()
{
    ConditionalSomeMethod?.Invoke();
    ConditionalSomeMethod2?.Invoke("hello");
}

如果委托为null,则不调用该方法。