实现“后备”类

时间:2010-11-15 18:20:01

标签: c# modeling

我有一组类,每个类都需要在某个时候决定它们应该在内部使用哪两种或三种方法来从外部实现相同的功能。理想情况下,这应该包括回退功能,如果ApproachA失败,它会通过尝试ApproachB(并且可能接近C,D等)。到目前为止,我一直在使用像if (!success) { ApproachB code }这样的编码。这样做的问题是,后面的几个方法也需要知道选择了哪种方法,并且所有方法都开发了自己的if (MethodChosen) { } else { }语句。我真的想用一些不那么笨拙的东西来解决这个问题......除了我认为的其他选择似乎都不那么“狡猾”。以下是我想到的三种方法:

  1. 实现一个静态.Create方法,该方法决定要创建两个派生类中的哪一个,其中两个类具有支持它们的接口。这样做的缺点是你写了很多相同的代码两次,而且它并没有真正创建一个“后备”,因为它强制所有的决策都是在.Create方法中预先完成的。这应该可以工作9/10次,但是只有当主要人员尝试过并且失败时,还有其他的1/10我希望后备才能启动。
  2. 与上面相同,但涉及基类或抽象类,要么作为两者的支持类,要么使用primary作为回退的基类。这具有相同的后备缺点,但至少很少或没有重复的代码。
  3. 实现一个正常构造的抽象类,其中包含可在运行时更改的子类:即

    public void SomeMethodOrConstructor()
    {
        if (someConditions)
            MyChild = ChildClassA;
        else
            MyChild = ChildClassB;
    }
    
    
    public void Execute()
    {
        MyChild.Execute();
    }
    
  4. 选项3的问题是在需要时在两者之间传递数据。由于这些方法中的一些是在对象之外进行建模,因此这将是相当频繁的。嵌套类是否自动与父类共享数据?或者我每次通话都要通过它吗?

    我还应该考虑其他什么?


    更新:第一堂课正在运行责任链。目前,我选择在方法执行期间不使用策略模式或回退,因为我认为最终可能没有必要。我认为大多数这样的执行后备实际上会更好地保留在他们自己的课程中,因为不会完全改变游戏规划,只需要进行一些小的调整即可。如果结果不是这样,我至少知道我现在需要调查的是什么。

    感谢所有帮助最终解决方案的人!

    对于好奇,我的终极解决方案大致如下:

    • 创建Handler抽象类,几乎与维基百科文章中所述,但使用public abstract Handler GetHandler()函数,并添加其他抽象方法,如加载,保存等。
    • 为父类实现私有处理程序子类(它们也可能是子类,因为它们只会处理该特定类的内容...避免以后命名问题)。子类都在其构造函数中获取父对象类型的参数,因此可以轻松访问父数据。
    • 从父类的构造函数中,设置Chain of Responsibility处理程序/后继程序(再次,就像示例一样),然后调用FirstHandler.GetHandler(this)并存储结果,以便类知道将来使用哪个处理程序。 / LI>
    • 大多数处理过的方法只需简化为Handler.MethodName()

3 个答案:

答案 0 :(得分:5)

使用Chain of Responsibility

  

责任链模式是一个   设计模式由源组成   命令对象和一系列   处理对象。每次加工   对象包含一组逻辑   描述了命令对象的类型   它可以处理,如何传递   那些它无法处理的   链中的下一个处理对象。一个   机制也存在添加新的   处理对象到此结束   链

这完全符合您的需要。

答案 1 :(得分:1)

我可能会在这里使用策略模式。

http://en.wikipedia.org/wiki/Strategy_pattern

您只需要传递delgates而不是整个类。如果所有方法都使用相同的信息进行处理,这可能会有所帮助。

答案 2 :(得分:0)

我认为您需要Task / Task<T>,尤其是ContinueWith(Action<Task>)方法和4个属性:IsCanceledIsCompletedIsFaulted和{{ 1}}。