装饰一个静态类 C#

3

我有一个设计问题。

在一些旧代码中使用了一个静态类来调用一个静态方法来执行一些操作。如果满足某个条件,我想在它之后立即调用另一个方法。

我想使用装饰器模式,但如果不满足条件,我无法返回静态类的实例。

目前的情况是这样的。

var result = StaticClass.DoSomething(some parameters);

如果另一个变量为真,我希望在调用DoSomething后立即写入数据库,而我不想只是堆积条件语句到旧代码中,所以我宁愿将其委托给其他类。这就是我真正想做的。

var result = StaticClassFactory(condition).DoSomething(some parameters);

Class1
void DoSomething(parameters) {
StaticClass.DoSomething()
}

Class2
void DoSomething(parameters) {
StaticClass.DoSomething();
DoSomethignElse();
}

任何建议?
1个回答

3
你可以使用接口来代表“执行者”:
public interface IDoer
{
    void DoSomething(object parameters);
}

然后创建两个类:

public class DefaultDoer : IDoer
{
    public void DoSomething(object parameters) 
    {
        StaticClass.DoSomething(object parameters);
    }
}

public class AugmentedDoer : IDoer
{
    public void DoSomething(object parameters) 
    {
        StaticClass.DoSomething(object parameters);
        DoSomethingElse();
    }
}

然后使用工厂根据条件返回实现IDoer接口的实例:
public class DoerFactory
{
    public IDoer GetDoer(object someCondition)
    {
        //Determine which instance to create and return it here
    }
}

在某些情况下,由于没有更多的信息可用,我使用了类型为object的占位符。


1
我喜欢这个想法,但为了良好的封装性,最好创建一个抽象的Doer类,其中包含一个虚拟的DoStuff()方法,该方法调用一个非虚拟的DoSomething()方法。然后,您可以干净地继承它以创建DefaultDoer,并在AugmentedDoer上重写DoStuff()。这意味着您只需编写一次DoSomething()代码。不过还是坚持使用工厂模式! - Rich Bryant
确切地说,@RichBryant。还有其他的方法,但我坚持符合OP要求的方式。 - JuanR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接