Java Command Pattern预填充Invoker类的列表

时间:2017-03-28 07:02:00

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

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

由于每台机器都以不同的格式发送String,因此不能使用单一和通用的String解析器。负责从机器获取String的类称为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。 COBASParser

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。 E170Parser

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
   }

}

1 个答案:

答案 0 :(得分:0)

您已完成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机制。