博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习之路--解释器模式
阅读量:4165 次
发布时间:2019-05-26

本文共 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类是整理二叉树的逻辑。这就是解析器模式的简单运用。

你可能感兴趣的文章
三维分析之视频投放
查看>>
SuperMap iDesktop之栅格值怎么查
查看>>
SuperMap iClient3D for WebGL教程-orientation
查看>>
SuperMap iClient3D for WebGL教程-description描述属性
查看>>
SuperMap iClient3D for WebGL教程-CallbackProperty
查看>>
如何修改leaflet聚合图的层级和样式
查看>>
三维分析之开敞度分析
查看>>
BIM+GIS应用的八大挑战
查看>>
.net实现.aspx页面自动加载.cs程序定义的变量并按照格式输出
查看>>
[Leetcode]最后一个单词的长度
查看>>
merges sort use c++
查看>>
插入排序用递归实现
查看>>
工作流审批平台-审批流程-指定审批部门
查看>>
商务智能-系统概述-数据图形方式
查看>>
软件项目管理系统-项目管理-模块定义-开发内容
查看>>
工作流审批平台-审批功能
查看>>
商务智能-基本方法-特征与角度
查看>>
软件项目管理系统-项目管理-模块定义-开发笔记
查看>>
工作流审批平台-业务申请-申请书一览
查看>>
商务智能-基本方法-数据钻取
查看>>