pie*_*105 6 parsing design-patterns
我有一个逻辑问题。我必须编写一个程序来解析不同类型的消息。下面我展示了这些消息的示例:
MESS1
DATE=06.06.2016
CAR_MODEL=OPEL
#Total_Number3
#Max_HP123
MESS2
DATE=12.01.2016
CAR_MODEL=FORD
MARTIN/SMITH
JOHN/PUTIN
MESS3
DATE=13.12.2016
CAR_MODEL=BMW
1/3/4
Run Code Online (Sandbox Code Playgroud)
我知道以简单的方式编码并不困难,但我想使用设计模式来实现这一点,这样当出现新类型的消息、某些类型的消息更改或消息包含不同顺序的数据时,我可以轻松修改它。
PS 我正在考虑 Builder,但消息不包含相同的字段,所以我认为它不适合。
提前致以问候和感谢!
根据你的问题,我假设你有几个 MessageFormats,它们有一些共同的字段,有些则不然,并且需要一种机制来解析它们中的每一个。
访客模式绝对是您所寻找的。
您可以按如下方式组织您的课程。所以这里的访客是不同的MessageFormat。它们可以从一个共同的父级继承,因为它们具有一些共同的属性,而 MessageParser 是相应地对待每个访问者的看护者。
public abstract class MessageFormat{
private String commonField1;
private String commonField2;
// getters and setters.
}
public class MessageFormat1 extends MessageFormat{
private String nonCommonField1;
private String nonCommonField2;
// getters and setters.
}
Run Code Online (Sandbox Code Playgroud)
像上面一样,您可以定义不同的消息格式 MessageFormat2、MessageFormat3 等。现在您应该使用方法重载来实现看护者类 (MessageParser) 的方法来完成访问者模式。
public class MessageParser{
public void parse(MessageFormat1 mf){
// logic specific to MessageFormat1.
}
public void parse(MessageFormat2 mf){
// logic specific to MessageFormat2.
}
}
Run Code Online (Sandbox Code Playgroud)
如果您想要一些通用逻辑来解析公共字段,您可以在 MessageParser 类中执行如下操作。
public class MessageParser{
public void parse(MessageFormat1 mf){
parse(mf); // calling private method.
// logic specific to MessageFormat1.
}
private void parse(MessageFormat mf){
// logic common to all MessageFormats.
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我提到的返回类型应根据您的要求进行调整。