我有一组类,每个类都需要在某个时候决定它们应该在内部使用哪两种或三种方法来从外部实现相同的功能。理想情况下,这应该包括回退功能,如果ApproachA失败,它会通过尝试ApproachB(并且可能接近C,D等)。到目前为止,我一直在使用像if (!success) { ApproachB code }
这样的编码。这样做的问题是,后面的几个方法也需要知道选择了哪种方法,并且所有方法都开发了自己的if (MethodChosen) { } else { }
语句。我真的想用一些不那么笨拙的东西来解决这个问题......除了我认为的其他选择似乎都不那么“狡猾”。以下是我想到的三种方法:
实现一个正常构造的抽象类,其中包含可在运行时更改的子类:即
public void SomeMethodOrConstructor()
{
if (someConditions)
MyChild = ChildClassA;
else
MyChild = ChildClassB;
}
public void Execute()
{
MyChild.Execute();
}
选项3的问题是在需要时在两者之间传递数据。由于这些方法中的一些是在对象之外进行建模,因此这将是相当频繁的。嵌套类是否自动与父类共享数据?或者我每次通话都要通过它吗?
我还应该考虑其他什么?
更新:第一堂课正在运行责任链。目前,我选择在方法执行期间不使用策略模式或回退,因为我认为最终可能没有必要。我认为大多数这样的执行后备实际上会更好地保留在他们自己的课程中,因为不会完全改变游戏规划,只需要进行一些小的调整即可。如果结果不是这样,我至少知道我现在需要调查的是什么。
感谢所有帮助最终解决方案的人!
对于好奇,我的终极解决方案大致如下:
public abstract Handler GetHandler()
函数,并添加其他抽象方法,如加载,保存等。FirstHandler.GetHandler(this)
并存储结果,以便类知道将来使用哪个处理程序。 / LI>
Handler.MethodName()
。答案 0 :(得分:5)
责任链模式是一个 设计模式由源组成 命令对象和一系列 处理对象。每次加工 对象包含一组逻辑 描述了命令对象的类型 它可以处理,如何传递 那些它无法处理的 链中的下一个处理对象。一个 机制也存在添加新的 处理对象到此结束 链
这完全符合您的需要。
答案 1 :(得分:1)
我可能会在这里使用策略模式。
http://en.wikipedia.org/wiki/Strategy_pattern
您只需要传递delgates而不是整个类。如果所有方法都使用相同的信息进行处理,这可能会有所帮助。
答案 2 :(得分:0)