九折技术 九折技术
首页
  • Go
  • MIT-6824
  • 算法与数据结构
  • 面向对象
  • 代码整洁
  • 重构
  • 设计模式
  • 学习
  • 技术
  • 人文
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub

HoldDie

长期有耐心,一切才刚刚开始!
首页
  • Go
  • MIT-6824
  • 算法与数据结构
  • 面向对象
  • 代码整洁
  • 重构
  • 设计模式
  • 学习
  • 技术
  • 人文
关于
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub
  • 代码整洁

  • 重构

  • 设计模式

    • 创建型-单例模式
    • 创建型-工厂模式
    • 创建型-建造者模式
    • 创建型-原型模式
    • 结构型-代理模式
    • 结构型-桥接模式
    • 结构型-装饰器模式
    • 结构型-适配器模式
    • 结构型-门面模式
    • 结构型-组合模式
    • 结构型-享元模式
    • 行为型-观察者模式
    • 行为型-模板模式
    • 行为型-策略模式
    • 行为型-责任链模式
    • 行为型-状态模式
    • 行为型-迭代器模式
    • 行为型-访问者模式
    • 行为型-备忘录模式
    • 行为型-命令模式
    • 行为型-解释器模式
      • 行为型-中介模式
    • 架构
    • 设计模式
    holddie
    2020-11-24

    行为型-解释器模式

    # 解释器模式

    • 主要用于编译器、规则引擎、正则表达式等场景。
    • Interpreter Design Pattern
    • 解释器模式为某个语言定义它的语法表示,并定义一个解释器用来处理这个语法。解释器模式就是用来根据语法规则解读“句子”的解释器。
    • 解释器模式的代码实现比较灵活,没有固定的模板。核心思想就是讲语法解析的工作拆分到各个小类中,以此来避免大而全的解析类。
    • 解释器模式一般的做法是,将语法规则拆分一些小的独立的单元,然后对每个单元进行解析,最终合并为对整个语法规则的解析。
    public interface Expression {
      boolean interpret(Map<String, Long> stats);
    }
    
    public class GreaterExpression implements Expression {
      private String key;
      private long value;
    
      public GreaterExpression(String strExpression) {
        String[] elements = strExpression.trim().split("\\s+");
        if (elements.length != 3 || !elements[1].trim().equals(">")) {
          throw new RuntimeException("Expression is invalid: " + strExpression);
        }
        this.key = elements[0].trim();
        this.value = Long.parseLong(elements[2].trim());
      }
    
      public GreaterExpression(String key, long value) {
        this.key = key;
        this.value = value;
      }
    
      @Override
      public boolean interpret(Map<String, Long> stats) {
        if (!stats.containsKey(key)) {
          return false;
        }
        long statValue = stats.get(key);
        return statValue > value;
      }
    }
    
    // LessExpression/EqualExpression跟GreaterExpression代码类似,这里就省略了
    
    public class AndExpression implements Expression {
      private List<Expression> expressions = new ArrayList<>();
    
      public AndExpression(String strAndExpression) {
        String[] strExpressions = strAndExpression.split("&&");
        for (String strExpr : strExpressions) {
          if (strExpr.contains(">")) {
            expressions.add(new GreaterExpression(strExpr));
          } else if (strExpr.contains("<")) {
            expressions.add(new LessExpression(strExpr));
          } else if (strExpr.contains("==")) {
            expressions.add(new EqualExpression(strExpr));
          } else {
            throw new RuntimeException("Expression is invalid: " + strAndExpression);
          }
        }
      }
    
      public AndExpression(List<Expression> expressions) {
        this.expressions.addAll(expressions);
      }
    
      @Override
      public boolean interpret(Map<String, Long> stats) {
        for (Expression expr : expressions) {
          if (!expr.interpret(stats)) {
            return false;
          }
        }
        return true;
      }
    
    }
    
    public class OrExpression implements Expression {
      private List<Expression> expressions = new ArrayList<>();
    
      public OrExpression(String strOrExpression) {
        String[] andExpressions = strOrExpression.split("\\|\\|");
        for (String andExpr : andExpressions) {
          expressions.add(new AndExpression(andExpr));
        }
      }
    
      public OrExpression(List<Expression> expressions) {
        this.expressions.addAll(expressions);
      }
    
      @Override
      public boolean interpret(Map<String, Long> stats) {
        for (Expression expr : expressions) {
          if (expr.interpret(stats)) {
            return true;
          }
        }
        return false;
      }
    }
    
    public class AlertRuleInterpreter {
      private Expression expression;
    
      public AlertRuleInterpreter(String ruleExpression) {
        this.expression = new OrExpression(ruleExpression);
      }
    
      public boolean interpret(Map<String, Long> stats) {
        return expression.interpret(stats);
      }
    } 
    
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    编辑
    #解释器模式
    上次更新: 2020/11/29, 15:11:00
    行为型-命令模式
    行为型-中介模式

    ← 行为型-命令模式 行为型-中介模式→

    最近更新
    01
    行为型-访问者模式
    11-24
    02
    行为型-备忘录模式
    11-24
    03
    行为型-命令模式
    11-24
    更多文章>
    Theme by Vdoing | Copyright © 2019-2020 HoldDie | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式