23 种设计模式中的表明器模式

打印 上一主题 下一主题

主题 1623|帖子 1623|积分 4869

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给定一个语言,界说它的文法的一种表示,并界说一个表明器,这个表明器利用该表示来表明语言中的句子。
  这种模式通常用于需要表明实行某种语言的场景,如正则表达式、SQL剖析等。
表明器模式的核心组件。


  • 抽象表达式(AbstractExpression):声明一个抽象的表明操作
  • 闭幕符表达式(TerminalExpression):实现与文法中的闭幕符相干的表明操作
  • 非闭幕符表达式(NonterminalExpression):实现文法规则的表明操作
  • 上下文(Context):包罗表明器之外的一些全局信息
  • 客户端(Client):构建表示该文法界说的语言中一个特定句子的抽象语法树
下面通过实现一个简单的数学表达式的表明器,来演示表明器模式。
抽象表达式接口。
  1. public interface Expression {
  2.     int interpret();
  3. }
复制代码
闭幕符表达式实现。
  1. public class NumberExpression implements Expression {
  2.     private int number;
  3.    
  4.     public NumberExpression(int number) {
  5.         this.number = number;
  6.     }
  7.    
  8.     @Override
  9.     public int interpret() {
  10.         return number;
  11.     }
  12. }
复制代码
非闭幕符表达式(加法)。
  1. public class AddExpression implements Expression {
  2.     private Expression left;
  3.     private Expression right;
  4.    
  5.     public AddExpression(Expression left, Expression right) {
  6.         this.left = left;
  7.         this.right = right;
  8.     }
  9.    
  10.     @Override
  11.     public int interpret() {
  12.         return left.interpret() + right.interpret();
  13.     }
  14. }
复制代码
非闭幕符表达式(减法)。
  1. public class SubtractExpression implements Expression {
  2.     private Expression left;
  3.     private Expression right;
  4.    
  5.     public SubtractExpression(Expression left, Expression right) {
  6.         this.left = left;
  7.         this.right = right;
  8.     }
  9.    
  10.     @Override
  11.     public int interpret() {
  12.         return left.interpret() - right.interpret();
  13.     }
  14. }
复制代码
上下文类。
  1. import java.util.Stack;
  2. public class ExpressionParser {
  3.     public static Expression parse(String expression) {
  4.         Stack<Expression> stack = new Stack<>();
  5.         String[] tokens = expression.split(" ");
  6.         
  7.         for (int i = 0; i < tokens.length; i++) {
  8.             String token = tokens[i];
  9.             
  10.             if (isOperator(token)) {
  11.                 Expression left = stack.pop();
  12.                 Expression right = new NumberExpression(Integer.parseInt(tokens[++i]));
  13.                 Expression operator = getOperatorExpression(token, left, right);
  14.                 stack.push(operator);
  15.             } else {
  16.                 stack.push(new NumberExpression(Integer.parseInt(token)));
  17.             }
  18.         }
  19.         
  20.         return stack.pop();
  21.     }
  22.    
  23.     private static boolean isOperator(String token) {
  24.         return token.equals("+") || token.equals("-");
  25.     }
  26.    
  27.     private static Expression getOperatorExpression(String operator,
  28.                                                   Expression left,
  29.                                                   Expression right) {
  30.         switch (operator) {
  31.             case "+": return new AddExpression(left, right);
  32.             case "-": return new SubtractExpression(left, right);
  33.             default: throw new IllegalArgumentException("Unknown operator: " + operator);
  34.         }
  35.     }
  36. }
复制代码
客户端,测试输出结果。
  1. public class InterpreterDemo {
  2.     public static void main(String[] args) {
  3.         String expression = "1 + 2 - 3 + 4";
  4.         Expression parsedExpression = ExpressionParser.parse(expression);
  5.         int result = parsedExpression.interpret();
  6.         
  7.         System.out.println(expression + " = " + result);
  8.     }
  9. }
复制代码
表明器模式为特定类型的问题提供了优雅的办理方案,但在实际应用中需要权衡其复杂性和性能影响。
总结

表明器模式通过界说语法树来实现对用户输入内容的表明实行。
表明器模式在 Java 中可能不是首选,假如碰到适用场景,可以考虑利用外部依靠库来取代。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

缠丝猫

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表