解析文本的设计模式

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,但消息不包含相同的字段,所以我认为它不适合。

提前致以问候和感谢!

Sup*_*hne 4

根据你的问题,我假设你有几个 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)

请注意,我提到的返回类型应根据您的要求进行调整。