本文共 3302 字,大约阅读时间需要 11 分钟。
设计模式是进阶到架构师的必备技能,当然不只是记住他们的名字,而是要学会他们的精髓。这就不简单了,还是得靠经验和学习。无美女,不代码!
解释器模式使用的还是有点少,但是也是一个很重要的模式之一,在安卓源码使用的就不少了。解释器,顾名思义。就是对解释算法逻辑的封装。比如传入一串加减乘除的字符串,最后得到一个结果。使用者只关心结果,不关心中间层如何解释计算的。那么就需要对解释过程进行封装。正则表达式也是类似,这里就不介绍正则了。就举个加减乘除的解释器计算字符串“5 * 6 / 3 + 2”。
我们先简单的对运算过程进行分析。
那么我需要终结点类和非终结点类。用于接收传入的计算最小单位。还需要一个接口来获得结果。
public interface Node { int interpert();}
/** * 终结点 * Created by Administrator on 2017/1/7. */public class EndPoint implements Node{ protected int number; public EndPoint(int number) { this.number = number; } @Override public int interpert() { return number; }}
public class NotEndPoint{ //终结点由两个终结点计算得出 protected Node left; //左右两个整数 protected Node right; public NotEndPoint(Node left, Node right) { this.left = left; this.right = right; }}
接下来就是写详细的算法过程。
/** * 加法运算 * * Created by Administrator on 2017/1/7. */public class AddOperation extends NotEndPoint implements Node{ public AddOperation(Node left, Node right) { super(left, right); } @Override public int interpert() { return left.interpert()+right.interpert(); }}
/** * Created by Administrator on 2017/1/7. */public class DivOperation extends NotEndPoint implements Node{ public DivOperation(Node left, Node right) { super(left, right); } @Override public int interpert() { return left.interpert()/right.interpert(); }}
public class MulOperation extends NotEndPoint implements Node{ public MulOperation(Node left, Node right) { super(left, right); } @Override public int interpert() { return left.interpert()*right.interpert(); }}最关键的是运算类,运算逻辑都在这里。
public class Operation implements Node { private String str; public Operation(@NonNull String str) { this.str = str; } @Override public int interpert() { //特殊约定,以空格作为分隔符 String[]allStrs = str.split(" "); Log.i("tag00","传入的字符串:"+str +"分解之后:"+allStrs.length); Node left = null; Node right = null; Node result = null; for (int position = 0; position < allStrs.length; position++) { switch (allStrs[position]){ case "*": left = result; right = new EndPoint(Integer.parseInt(allStrs[++position])); //运算之后获得非终结点 result = new MulOperation(left,right); break; case "/": left = result; right = new EndPoint(Integer.parseInt(allStrs[++position])); //运算之后获得非终结点 result = new DivOperation(left,right); break; case "+": left = result; right = new EndPoint(Integer.parseInt(allStrs[++position])); //运算之后获得非终结点 result = new AddOperation(left,right); break; default: result = new EndPoint(Integer.parseInt(allStrs[position])); break; } } return result.interpert(); }}然后调用
Operation operation = new Operation("5 * 6 / 3 + 2"); Log.i("tag00","结果:"+operation.interpert());结果就算出来了。这里面运用到了二叉树分析算法。一层一层向下递归,最后获得结果。而Operation类是整理二叉树的逻辑。这就是解析器模式的简单运用。