【问题标题】:Appropriate design pattern for choosing between two classes which do not have similar functions在两个没有相似功能的类之间进行选择的适当设计模式
【发布时间】:2017-11-28 04:33:56
【问题描述】:

我有 2 个类 Workflow1.java 和 Workflow2.java。在类 Selection.java 中,我希望能够在将两个类之一实例化为静态成员之间进行选择,但是我无法实现工厂模式,因为 Workflow1 和 Workflow2 不能是子类,因为它们的方法不同。尽管它们实现了相同的最终结果,但它们是通过完全不同的操作来实现的。这种场景有设计模式吗?

示例:如果类是 WalkHelper.java 和 DriveHelper.java,您在每个类中需要的方法完全不同,但您要实现的目标是相同的 - 到达目的地。我还没有创建 walk() 和 drive() 作为方法,因为 WalkHelper.java 已经存在于我们的代码库中,我正在向其中添加 DriveHelper.java。

【问题讨论】:

  • 如果Workflow1.javaWorkflow2.java 有不同的方法集,您打算如何从将使用这两个类中的任何一个的客户中抽象出来?您能详细说明一下您的要求吗?
  • @Indra 有一个很好的观点,这应该是你要走的路,但是,如果你必须与众不同,你可以构建一个对象工厂,然后在每次你想用它做任何事情时强制转换它它。您绝对应该考虑 Indra 的 cmets
  • @Indra 包含条件检查的类将被客户端调用以执行操作。客户端不直接与 Workflow1.java 和 Workflow2.java 交互。它们包含为用户提供最终结果的逻辑。
  • @laksmiiragavarapu 正如人们已经提到的,您应该使用适配器模式和工厂模式。适配器模式将一个类转换为客户期望的另一个接口/类。
  • @IndraBasak 我会尝试解决方案并更新

标签: java design-patterns


【解决方案1】:

听起来您仍然可以使用Factory 模式,但您可能必须使用Adaptor 才能使它们相等...在不了解更多信息的情况下,这是一个很难回答的问题。

interface IFactory {
  void run();
  String getResult();
}

class Workflow1Adapter implements IFactory {
  Workflow1 wf1 = new Workflow1();

  public void run() {
    wf1.doSomething();
  }

  public String getResult() {
    wf1.doAnother();
  }
}

class Workflow2Adapter implements IFactory {
  Workflow2 wf2 = new Workflow2();

  public void run() {
    wf2.doThatThing();
  }

  public String getResult() {
    wf2.doReturn();
  }
}

class Workflow1 {
  public void doSomething() {}
  public String doAnother() {}
}

class Workflow2 {
  public void doThatThing() {}
  public String doReturn() {}
}

【讨论】:

  • 我想过让两个类的包装器(或者你说的适配器)实现一个接口,但我认为这太复杂了,也许还有其他模式结合了工厂和包装器
  • tutorialspoint.com/design_pattern/index.htm 。通过并提出建议。很高兴发表评论。
  • 你想要设计模式,没有一种叫做 Wrapper :)
  • 我会通过链接更新。谢谢 :) 我看到了这个 thecodedself.com/… 并阅读了有关适配器的信息,所以我很困惑。还有stackoverflow.com/questions/350404/…
  • 我以前听说过它们称为 Wrappers,但是 Wrapper 可以是装饰器、适配器甚至是代理模式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 2015-07-18
  • 2013-02-23
  • 2017-12-16
  • 2013-09-19
  • 2011-06-22
  • 2021-10-12
相关资源
最近更新 更多