实现"后备"类

Rob*_*d70 5 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();
    }
    
    Run Code Online (Sandbox Code Playgroud)

选项3的问题是在需要时在两者之间传递数据.由于这些方法中的一些是在对象之外进行建模,因此这将是相当频繁的.嵌套类是否自动与父类共享数据?或者我是否必须在每次通话时都通过?

还有什么我应该考虑的吗?


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

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

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

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

Ali*_*tad 5

使用责任链.

责任链模式是一种设计模式,由命令对象源和一系列处理对象组成.每个处理对象都包含一组逻辑,用于描述它可以处理的命令对象的类型,以及如何将它无法处理的命令对象传递 给链中的下一个处理对象.还存在一种机制,用于将新处理对象添加到此链的末尾.

这非常适合您需要做的事情.