Parsing 解析文本的设计模式

Parsing 解析文本的设计模式,parsing,design-patterns,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 我知道用一种简单的方式编写代码并不困难,但我想使用设计

我有一个逻辑问题。我必须写一个程序来解析不同类型的消息。 下面我将展示这些消息的外观示例:

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
我知道用一种简单的方式编写代码并不困难,但我想使用设计模式来实现这一点,它允许我在需要时轻松地修改它 出现新类型的消息、某些类型的消息更改或消息包含不同顺序的数据

另外,我在考虑构建器,但是消息不包含相同的字段,所以我认为它不适合


提前问候和感谢

根据你的问题,我假设你有几种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.
}
如上所述,您可以定义不同的消息格式MessageFormat2、MessageFormat3等。现在您应该使用来实现care taker类(MessageParser)的方法来完成访问者模式

public class MessageParser{

    public void parse(MessageFormat1 mf){
        //logic specific to MessageFormat1.
    }

    public void parse(MessageFormat2 mf){
        //logic specific to MessageFormat2.
    }

}
若您想拥有一些用于解析公共字段的公共逻辑,可以在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.
    }

}

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

我很困惑。我看到这3种消息类型都有日期和车型,但附加信息代表什么?这只是一个示例。这并不意味着每条消息代表什么,主要的意思是每条消息都包含共享的属性,另外还有它自己的属性。我想到了使用“小语言”的想法,但我找不到它的任何链接:(“小语言”也被称为解释器模式:嗨,谢谢,这是我一直在寻找的模式。如果有可能在每种消息格式中不实现相同的visior接口,那将是完美的。我的意思是。假设我们有3种消息格式,具有不同的字段,其中2种可以由TaxVisitor管理,但是第三种方法与税收没有任何共同之处,因此没有必要为他取消访问方法。有没有办法绕过这种方法而不抛出未实现的异常?@piess105那么第三种方法不需要实现访问方法吗?虽然它没有任何税收手段,但它需要访问我对吗??