【问题标题】:Java Command Pattern prepopulate list of Invoker classJava 命令模式预填充 Invoker 类的列表
【发布时间】:2017-03-28 07:01:59
【问题描述】:

我有许多类可以解析字符串。这些字符串由 LAS(实验室自动化系统)机器在执行样本测试后发送,然后解析器类负责解析它们并从字符串中提取结果。

由于每台机器都以不同的格式发送字符串,所以不能有单一和通用的字符串解析器。负责从机器获取字符串的类称为Controller。控制器知道机器的所有信息并且是通用的。只有一个Controller 和多个解析器。

现在问题Controller如何知道调用哪个解析器来提取数据。

我已经实现了Command Pattern,但根据示例,private List<Order> orderList = new ArrayList<Order>(); 这个列表需要在调用invoke() 之前填充。

所以,感觉我需要创建所有 Parser 类的对象并将它们添加到列表中,以便知道应该调用哪个 Parser。

这是我的代码:

抽象解析器:

public abstract class Parser {

private final String resultString;
private final String machineId;

  protected Parser(final String result, final String machineId){
    resultString = result;
    this.machineId = machineId;
  }

  /**
   * This method's implementation will parse the output string. The method    @see setResultString(String) must be called before parsing. 
   */
  abstract void  Parse();

  protected String getResultString(){
     return this.resultString;
  }

  protected String getMachineId(){
     return this.machineId;
  }
}

具体解析器:

1. COBAS解析器

public class COBASParser extends Parser{

  public COBASParser(final String resultString, final String machineId){
     super(resultString, machineId);
  }

@Override
 void Parse() {
     System.out.println("This is COBAS's Parse() method");
     System.out.println("ResultString:: "+getResultString());
  }

}

2. E170解析器

public class E170Parser extends Parser {

  public E170Parser(final String resultString, final String machineId) {
     super(resultString, machineId);
  }

  @Override
  void Parse() {
     System.out.println("This is E170Parser's Parse() method");
     System.out.println("ResultString:: "+getResultString());
  }
}

调用者类:

public class ParserInvoker {

  private static ParserInvoker me;
  private List<Parser> parsersList;

  private ParserInvoker() {
     parsersList = new ArrayList<>();
  }

  public void addParser(Parser parser) {
     parsersList.add(parser);
  }

/**
 * Invokes concrete class parser.
 * @param machineId 
 */
 public void invoke(final String machineId) {
      for (Parser p : parsersList) {
         if (p.getMachineId().equals(machineId)) {
             p.Parse();
         }
      }
 }
 public static synchronized ParserInvoker getInvoker() {
     if (me == null) {
         me = new ParserInvoker();
      }
      return me;
 }
}

我该怎么办?我应该采用任何其他模式(抽象工厂模式)还是我没有正确实现该模式?

这是我的Controller

class LASController{

   void OnDataRecieve(String resultString, String machineId){
     // Call Parser here
   }

}

【问题讨论】:

  • 对于工作代码,codereview.stackexchange.com 会是一个更好的地方。我们不在这里讨论代码,我们只是在它坏了时提供帮助;-)
  • 我投票结束这个问题,因为它更适合 Code Review SE!
  • 这不是关于代码,而是关于方法 :-),我需要帮助解决问题的方法。
  • 而对于那个,我认为它太宽泛了。
  • 如果您能指出修改,我们可以缩小范围

标签: java design-patterns factory-pattern command-pattern ooad


【解决方案1】:

你已经完成了command pattern的前4步,这是最后一步:

class LASController{

   void OnDataRecieve(String resultString, String machineId){
     // Call Parser here
       Parser p1 = new COBASParser(resultString1, machineId1);
       Parser p2 = new E170Parser(resultString2, machineId2);
       ParserInvoker.getInvoker().addParser(p1);
       ParserInvoker.getInvoker().addParser(p2);
       // invoke parser
       ParserInvoker.getInvoker().invoke(machineId);
   }
}

此模式利用了 Java polymorphic 机制。

【讨论】:

  • 谢谢 Dave,如果我有 50 个解析器呢?我会创建 50 个对象吗?这里如何使用抽象工厂模式?
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 2010-10-30
  • 2012-11-27
  • 2013-04-11
  • 2015-07-31
相关资源
最近更新 更多