• Behavioral模式之Interpreter模式


    1.意图

    给定一个语言,定义它的文法的一种表示。并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

    2.别名

    3.动机

    假设一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各种实例表述为一种简单语句中的句子。这样就能够构建一个解释器,该解释器通过解释这些句子来解决该问题。

    4.适用性

    下面情况使用Interpreter模式:
    当有一种语言须要解释运行,并且你能够将该语言中的句子表示为一个抽象语法树时,可使用解释器模型。而当存在下面情况时该模式效果最好。


    - 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。此时语法分析程序生成器这种工具是更好的选择。

    他们无需构建抽象语法树就可以解释表达式。这样能够节省空间并且还可能节省时间。
    - 效率不是一个关键问题。最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们转换成还有一种形态。比如,正則表達式通常被转换成状态机。但及时在这种情况下,转化器仍可用解释器模式实现,该模式仍是实用的。

    5.结构

    释器模式是我们临时的最后一讲,一般主要应用在OOP开发中的编译器的开发中。所以适用面比較窄。
    Interpreter模式

    6.代码演示样例

    实现代码:
    Context类是一个上下文环境类,Plus和Minus各自是用来计算的实现。代码例如以下:

    public interface Expression {
        public int interpret(Context context);
    }
    

    实现类

    public class Plus implements Expression {
    
        @Override
        public int interpret(Context context) {
            return context.getNum1()+context.getNum2();
        }
    }
    
    public class Minus implements Expression {
    
        @Override
        public int interpret(Context context) {
            return context.getNum1()-context.getNum2();
        }
    }

    Context类

    public class Context {
    
        private int num1;
        private int num2;
    
        public Context(int num1, int num2) {
            this.num1 = num1;
            this.num2 = num2;
        }
    
        public int getNum1() {
            return num1;
        }
        public void setNum1(int num1) {
            this.num1 = num1;
        }
        public int getNum2() {
            return num2;
        }
        public void setNum2(int num2) {
            this.num2 = num2;
        }
    
    
    }

    測试类:

    public class Test {
    
        public static void main(String[] args) {
    
            // 计算9+2-8的值
            int result = new Minus().interpret((new Context(new Plus()
                    .interpret(new Context(9, 2)), 8)));
            System.out.println(result);
        }
    }

    最后输出正确的结果:3。
    基本就这样,解释器模式用来做各种各样的解释器,如正則表達式等的解释器等等。

    7.相关模式

    • Composite模式:抽象语法树是一个复合模式的实例。
    • Flyweight模式:说明了怎样在抽象语法树中共享终结符。
    • Iterator模式:解释器可用一个迭代器遍历该结构。

    • Visitor模式:可用来在一个类中维护抽象语法树中的各节点的行为。

    引用:

    http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm
    http://item.jd.com/10057319.html
    http://blog.csdn.net/zhangerqing/article/details/8239539

  • 相关阅读:
    Redis教程16-服务器
    剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
    剑指 Offer 18. 删除链表的节点
    剑指 Offer 16. 数值的整数次方
    通过GetLastError 获取win32 api 的错误信息
    Windows API 错误码
    VS2012程序打包部署详解
    C#中子类调用父类的实现方法
    获取有关编程语言的帮助?
    Windows API 错误码解析
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7119394.html
Copyright © 2020-2023  润新知