这是一种软件设计模式吗?

时间:2013-07-24 20:54:07

标签: c# design-patterns

假设你从这两个类开始:

public class Foo{   
    public virtual Baz Bar(){
        return GetStandardBaz();
    }
}

public class Qux: Foo{
    public virtual Baz Bar(){
        return GetQuxBaz();
    }
}

现在假设在Baz被调用时返回它之前需要对Bar执行某些操作。我会创建一个virtual protected方法,并从公共方法中删除virtual,如下所示:

public class Foo{   
    public Baz Bar(){
        var value = BarInternal();
        DoSomethingFirst(value);
        return value;
    }

    protected virtual Baz BarInternal(){
        return GetStandardBaz();
    }
}

public class Qux: Foo{
    protected override Baz BarInternal(){
        return GetQuxBaz();
    }
}

这可确保无论何时调用Bar,结果Baz都会在返回之前传递到DoSomethingFirst。是的,这是所有子课程的重大变化,但它不需要对Bar的任何呼叫站点进行任何更新。

这是标准的设计模式吗?有没有更好的方法让我失踪?还想知道是否有比Internal更好的修复后名称。

2 个答案:

答案 0 :(得分:2)

如果您按照以下方式略微更改Foo课程,则会获得Template Method pattern

public class Foo{   
    public Baz Bar(){
        var value = BarInternal();
        DoSomethingFirst(value);
        return value;
    }

    protected virtual Baz BarInternal(){
        return GetStandardBaz();
    }
}

您也可以使用Decorator pattern来实现类似的功能。决定将取决于您的课程的目的细节。

答案 1 :(得分:1)

这是一件好事,因为您可以以标准方式过滤输入和输出。您可以进行验证和其他处理。

您还可以验证输入,以便内部/虚拟方法可以依赖某些条件为真。

我通常使用后缀“Core”(GetBarCore)。