【发布时间】: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