设计模式之解释器模式

解释器模式(Interpreter Pattern),定义语言的文法,并定义一个解释器来解释语言中的句子,属于行为型模式。

组成

解释器模式由上下文 Context 、抽象表达式 AbstractExpression 、终结符表达式 TerminalExpression 和非终结符表达式 NonterminalExpression 组成。

其中 Context 包含解释器之外的一些全局信息;AbstractExpression 声明一个抽象的解释操作;TerminalExpression 实现与文法中终结符相关的解释操作;NonterminalExpression 实现与文法中非终结符相关的解释操作。

优点

易于修改和扩展文法。

缺点

复杂文法实现难度较大。

执行效率较低。

使用场景

发生频率较高的问题可以用简单的语言表达、文法较为简单时,可以使用解释器模式来解决该问题。

设计原则

遵循单一职责原则、开闭原则。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
public class DictionaryContext {

private static Map<String, String> dictionary = new HashMap<>();

static {
dictionary.put("today", "今天");
dictionary.put("is", "是");
dictionary.put("a", "一个");
dictionary.put("good", "好");
dictionary.put("day", "日子");
}

public static String getChinese(String englishWord) {
return dictionary.get(englishWord);
}
}

public interface Expression {
void interpret(StringBuilder stringBuilder);
}

public class SymbolExpression implements Expression {

private String value;

public SymbolExpression(String value) {
this.value = value;
}

@Override
public void interpret(StringBuilder stringBuilder) {
if (".".equals(value)) {
stringBuilder.append("。");
}
}
}

public class WordExpression implements Expression {

private String word;

public WordExpression(String word) {
this.word = word;
}

@Override
public void interpret(StringBuilder stringBuilder) {
stringBuilder.append(DictionaryContext.getChinese(word.toLowerCase()));
}
}

public class Client {
public static void main(String[] args) {
String sentence = "Today is a good day.Today is a good day.Today is a good day.";
System.out.println(translate(sentence));
}

private static String translate(String sentence) {
StringBuilder stringBuilder = new StringBuilder();
List<Expression> expressions = new ArrayList<>();
String[] elements = sentence.split("\\.");
for (String element : elements) {
String[] words = element.split(" ");
for (String word : words) {
expressions.add(new WordExpression(word));
}
expressions.add(new SymbolExpression("."));
}
for (Expression expression : expressions) {
expression.interpret(stringBuilder);
}
return stringBuilder.toString();
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信