解释器模式的定义是“定义一种语言的文法表示,并建立一个解释器来使用该表示来解释语言中的句子”。

基本上,解释器模式的应用领域有限。我们可以在形式文法方面讨论解释器模式,但在这一领域有更好的解决方案,因此它并不常用。

该模式可用于解析简单文法定义的表达式,有时也用于简单的规则引擎。

SQL解析使用了解释器设计模式。

解释器模式的优点

  • 更容易更改和扩展文法。
  • 实现文法相对简单。

解释器模式的使用场景

它用于:

  • 当语言的文法不复杂时。
  • 当效率不是优先考虑的因素时。

解释器模式示例

让我们通过上面的UML图来理解解释器模式的示例。

解释器模式的UML图:

3-1.jpg

上述UML的实现

第一步

创建一个Pattern接口。

public interface Pattern { 
    public String conversion(String exp); 
}

第二步

创建一个InfixToPostfixPattern类,用于将中缀表达式转换为后缀表达式。

文件:InfixToPostfixPattern.java

import java.util.Stack; 

public class InfixToPostfixPattern implements Pattern { 
    @Override 
    public String conversion(String exp) { 
        int priority = 0; // 操作符的优先级 
        String postfix = ""; 
        Stack<Character> s1 = new Stack<Character>(); 
        
        for (int i = 0; i < exp.length(); i++) { 
            char ch = exp.charAt(i); 
            
            if (ch == '+' || ch == '-' || ch == '*' || ch == '/' || ch == '%') { 
                // 检查优先级
                if (s1.size() <= 0) { 
                    s1.push(ch); 
                } else { 
                    Character chTop = (Character) s1.peek(); 
                    if (chTop == '*' || chTop == '/') { 
                        priority = 1; 
                    } else { 
                        priority = 0; 
                    } 
                    
                    if (priority == 1) { 
                        if (ch == '*' || ch == '/' || ch == '%') { 
                            postfix += s1.pop(); 
                            i--; 
                        } else { 
                            postfix += s1.pop(); 
                            i--; 
                        } 
                    } else { 
                        if (ch == '+' || ch == '-') { 
                            postfix += s1.pop(); 
                            s1.push(ch); 
                        } else { 
                            s1.push(ch); 
                        } 
                    } 
                } 
            } else {        
                postfix += ch; 
            } 
        } 
        
        int len = s1.size(); 
        for (int j = 0; j < len; j++) 
            postfix += s1.pop(); 
        
        return postfix; 
    }  
}

第三步

创建一个InterpreterPatternClient类,使用中缀到后缀转换。

文件:InterpreterPatternClient.java

public class InterpreterPatternClient { 
    public static void main(String[] args) { 
        String infix = "a+b*c"; 
        
        InfixToPostfixPattern ip = new InfixToPostfixPattern(); 
        
        String postfix = ip.conversion(infix); 
        System.out.println("Infix:  " + infix); 
        System.out.println("Postfix: " + postfix); 
    } 
}

输出

Infix:  a+b*c 
Postfix: abc*+

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式