我有许多解析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
}
}
答案 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
机制。