个性化阅读
专注于IT技术分析

解释器模式

解释器模式说:“定义给定语言的语法表示形式, 以及使用该表示形式来解释语言中句子的解释器”。

基本上, 解释器模式的应用区域有限。我们只能在形式语法方面讨论口译员模式, 但是在这一领域有更好的解决方案, 这就是为什么它不经常使用的原因。

此模式可用于解析在简单语法(有时在简单规则引擎中)中定义的表达式。

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


口译模式的优势

  • 更改和扩展语法更容易。
  • 实施语法很简单。

解释器模式的用法:

它用于:

  • 当语言的语法不复杂时。
  • 当效率不是重中之重时。

解释器模式示例

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

解释器模式的UML:

解释器模式UML

以上UML的实现

步骤1

创建一个模式界面。

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

第2步

创建一个InfixToPostfixPattern类, 该类将允许你转换哪种类型的模式。

import java.util.Stack;
public class InfixToPostfixPattern implements Pattern{
	@Override
	public String conversion(String exp) {
        int priority = 0;// for the priority of operators.
       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=='%')
           {
              // check the precedence
              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
                    { // Same
                       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;
		
	} 
}// End of the InfixToPostfixPattern class.

第三步

创建一个将使用InfixToPostfix转换的InterpreterPatternClient类。

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*+
赞(0)
未经允许不得转载:srcmini » 解释器模式

评论 抢沙发

评论前必须登录!