java设计模式之解释器模式

一、定义与类型:

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

》为了解释一种语言,二位语言创建的解释器。

》类型:行为型

二、适用场景:

》某个特定类型问题发生频率足够高;

一般使用开源包。

三、解释器模式优点:

》语法由很多类表示,容易改变及扩展此“语言”;

四、缺点:

》当语法规则数目太多时,增加了系统复杂度,现实中使用率极低。

五、相关模式:

解释器模式和适配器模式。

六、代码实践:

package pattern.behaviral.interprator;

/**
 * Created by Administrator on 2019/8/25.
 */
public interface Interpreter {
    int interpret();
}
package pattern.behaviral.interprator;


/**
 * Created by Administrator on 2019/8/25.
 */
public class AddInterpreter implements Interpreter{
    private Interpreter firstExpression,secondExpression;
    public AddInterpreter(Interpreter firstExpression,Interpreter secondExpression){
        this.firstExpression = firstExpression;
        this.secondExpression = secondExpression;
    }
    public int interpret() {
        return this.firstExpression.interpret()+this.secondExpression.interpret();
    }

    @Override
    public String toString() {
        return "+";
    }
}

package pattern.behaviral.interprator;

/**
 * Created by Administrator on 2019/8/25.
 */
public class MultiInterpreter implements Interpreter {
    private Interpreter firstExpression,secondExpression;
    public MultiInterpreter(Interpreter firstExpression,Interpreter secondExpression){
        this.firstExpression = firstExpression;
        this.secondExpression = secondExpression;
    }
    public int interpret() {
        return this.firstExpression.interpret()*this.secondExpression.interpret();
    }

    @Override
    public String toString() {
        return "*";
    }
}
package pattern.behaviral.interprator;

/**
 * Created by Administrator on 2019/8/25.
 */
public class OperatorUtil {
    public static boolean isOperator(String symbol){
        return (symbol.equals("+") || symbol.equals("*"));
    }
    public static Interpreter getExpressionObject(Interpreter firstInterpreter,Interpreter secondInterpreter,String symbol){
        if (symbol.equals("+")){
            return new AddInterpreter(firstInterpreter,secondInterpreter);
        }else if(symbol.equals("*")){
            return new MultiInterpreter(firstInterpreter,secondInterpreter);
        }
        return null;
    }
}
package pattern.behaviral.interprator;

/**
 * Created by Administrator on 2019/8/25.
 */
public class NumberInterpreter implements Interpreter {
    private int number;
    public NumberInterpreter(int number){
        this.number = number;
    }
    public NumberInterpreter(String number){
        this.number = Integer.parseInt(number);
    }
    public int interpret() {
        return this.number;
    }
}
package pattern.behaviral.interprator;

import com.sun.deploy.util.StringUtils;

import java.util.Stack;

/**
 * Created by Administrator on 2019/8/25.
 */
public class GeelyExpressionParser {
    private Stack<Interpreter> stack = new Stack<Interpreter>();

    public int parse(String str) {
        String[] strItemArray = str.split(" ");
        for (String symbol : strItemArray) {
            if (!OperatorUtil.isOperator(symbol)) {
                Interpreter numberExpression = new NumberInterpreter(symbol);
                stack.push(numberExpression);
                System.out.println(String.format("入栈:%d", numberExpression.interpret()));
            } else {
                //是运算符号可以计算
                Interpreter firstExpression = stack.pop();
                Interpreter secondExpression = stack.pop();
                System.out.println(String.format("出栈:%d 和 %d",
                        firstExpression.interpret(),
                        secondExpression.interpret()));
                Interpreter operator = OperatorUtil.getExpressionObject(firstExpression, secondExpression, symbol);
                System.out.println(String.format("应用运算符:%s", operator.interpret()));
                int result = operator.interpret();
                NumberInterpreter resultExpression = new NumberInterpreter(result);
                stack.push(resultExpression);
                System.out.println(String.format("阶段结果入栈:%d", resultExpression.interpret()));
            }

        }
        int result = stack.pop().interpret();
        return result;
    }
}
package pattern.behaviral.interprator;
/**
 * Created by Administrator on 2019/8/25.
 */
public class Test {
    public static void main(String[] args) {
        String geelyInputStr = "6 100 11 + *";
        GeelyExpressionParser expressionParser = new GeelyExpressionParser();
        int result = expressionParser.parse(geelyInputStr);
        System.out.println("解释器计算结果:"+ result);
    }
}
"D:\Program Files\Java\jdk1.8.0_102\bin\java" "-javaagent:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\lib\idea_rt.jar=51167:D:\InteliijIDea\IntelliJ IDEA 2017.1.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\Program Files\Java\jdk1.8.0_102\jre\lib\charsets.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\deploy.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\access-bridge-64.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\cldrdata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\dnsns.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jaccess.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\jfxrt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\localedata.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\nashorn.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunec.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunjce_provider.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunmscapi.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\sunpkcs11.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\ext\zipfs.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\javaws.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jce.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfr.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jfxswt.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\jsse.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\management-agent.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\plugin.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\resources.jar;D:\Program Files\Java\jdk1.8.0_102\jre\lib\rt.jar;E:\JavaDesignMode\target\classes" pattern.behaviral.interprator.Test
入栈:6
入栈:100
入栈:11
出栈:11 和 100
应用运算符:111
阶段结果入栈:111
出栈:111 和 6
应用运算符:666
阶段结果入栈:666
解释器计算结果:666

Process finished with exit code 0

七、jdk中的源码:

jdk中的正则表达式Pattern

spring中的el表达式 SpelExpressionParser Expression 类可以查看下,parseExpression()方法可以注意下

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值