• 移动架构-解释器模式


    解释器是一种用的比较少的行为模式,其提供了一种解释语言的语法,或者表达式的方式。该模式定义了一个表达式的接口

    应用场景

    1. 简单的语言需要解释执行而且可以将该语言中的语句表示一个抽象的语法树
    2. 对于某个特定的领域出现的不断重复的问题,可以转换成一种语法规则下的语句

    重点

    1. 必须有一个抽象接口
    2. 构建语法树

    优缺点

    优点:
    每个语法都要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来了非常多的麻烦
    缺点:
    解释器模式由于使用了大量的循环和递归,效率是个不容忽视的问题,特别是用于解析复杂、冗长的语法时,效率是难以忍受的

    解释实例

    这里使用一个解析计算表达式的例子
    抽象接口

    public interface Node {
    	public int interpret();
    }
    

    抽象接口的子类抽象类

    public abstract class SymbolNode implements Node{
    	
    	protected Node left;
    	protected Node right;
    	
    	public SymbolNode(Node left, Node right) {
    		this.left = left;
    		this.right = right;
    	}
    }
    

    实现类

    public class MulNode extends SymbolNode{
    
    	public MulNode(Node left, Node right) {
    		super(left, right);
    	}
    
    	@Override
    	public int interpret() {
    		return left.interpret() * right.interpret();
    	}
    }
    
    public class DivNode extends SymbolNode{
    
    	public DivNode(Node left, Node right) {
    		super(left, right);
    	}
    
    	@Override
    	public int interpret() {
    		return left.interpret() / right.interpret();
    	}
    }
    

    终结符

    public class ValueNode implements Node{
    
    	private int value;
    	
    	public ValueNode(int value) {
    		this.value = value;
    	}
    
    	@Override
    	public int interpret() {
    		return value;
    	}
    }
    

    计算方法

    public class Caculator {
    	public int build(String statement) {
    		Node left = null;
    		Node right = null;
    		Node last = null;
    		String[] state = statement.split(" ");
    		for (int i = 0; i < state.length; i++) {
    			if("*".equalsIgnoreCase(state[i])){
    				left = last;
    				int val = Integer.parseInt(state[++i]);
    				right = new ValueNode(val);
    				last = new MulNode(left, right);
    			}else if ("/".equalsIgnoreCase(state[i])) {
    				left = last;
    				int val = Integer.parseInt(state[++i]);
    				right = new ValueNode(val);
    				last = new DivNode(left, right);
    			}else {
    				last = new ValueNode(Integer.parseInt(state[i]));
    			}
    		}
    		return last.interpret();
    	}
    }
    

    测试类

    public class Test {
    	public static void main(String[] args) {
    		String contentString = "1 * 2 * 5 * 7 * 9 / 2";
    		Caculator caculator = new Caculator();
    		int result = caculator.build(contentString);
    		System.out.println("result = " + result);
    	}
    }
    
  • 相关阅读:
    3D游戏常用技巧Normal Mapping (法线贴图)原理解析——高级篇
    [工作积累] OpenGL ES3.0: glInvalidateFramebuffer
    引擎设计跟踪(九.14.2c) 最近一些小的更新
    引擎设计跟踪(九.14.2b) 骨骼动画基本完成
    最近在玩的游戏
    引擎设计跟踪(九.14.2a) 导出插件问题修复和 Tangent Space 裂缝修复
    [工作积累] Google/Amazon平台的各种坑
    [工作积累] NDK通过Java获取package name 和version
    [工作记录] Android OpenSL ES: references & AAC related
    [工作记录] Android OpenGL ES: non-square texture
  • 原文地址:https://www.cnblogs.com/cj5785/p/10664621.html
Copyright © 2020-2023  润新知