设计模式:解释器模式
一、定义:
给定一个语言,定义它的语法,并定义一个解释器,这个解释器用于解析语言。
二、角色
- AbstractExpression:抽象表达式,声明一个抽象的解释操作父类,并定义一个抽象的解释方法,其具体的实现在各个具体的子类解释器中完成;
- TerminalExpression:终结符表达式,实现文法中与终结符有关的解释操作。文法中每一个终结符都有一个具体的终结表达式与之对应。
- NonterminalExpression:非终结符表达式,实现文法中与非终结符有关的解释操作;
- Context:上下文环境类,包含解释器之外的全局信息;
三、使用场景
- 如果某个简单的语言需要解释执行而且可以将该语言中的语句表示为一个抽象的语法树时
- 某些特性的领域出现不断重复的问题时,可以将该领域的问题转化为语法规则下的语句,然后构建解释器来解释该语句,例如英文的大小写转换
四、模板代码
//抽象表达式
abstract class AbstractExpression {/* 抽象的解释方法 @param context 上下文环境对象*/public abstract void interpret(Context context);
}//终结符表达式
class TerminalExpression extends AbstractExpression {@Overridepublic void interpret(Context context) {// 实现文法中与终结符有关的解释操作}//非终结符表达式
class NonterminalExpression extends AbstractExpression {@Overridepublic void interpret(Context context) {// 实现文法中与非终结符有关的解释操作}
}//上下文环境类,包含解释器之外的全局信息
class Context {
}//客户端
public static void main(String[] args) {// 根据文法对特定句子构建抽象语法树后解释
}
五、在Android中的使用
- 项目中 AndroidManifest.xml 这个配置文件的解释(PackageParser)
四大组件需要在
AndroidManifest.xml
中定义,其实AndroidManifest.xml
就定义了<Activity>
,<Service>
等标签(语句)的属性以及其子标签,规定了具体的使用(语法),通过PackageManagerService(解释器)进行解析。
- 布局文件等xml文件最终都会被解析成java类的对象
- 开发中经常会用到json或xml格式的数据,并对其进行解析
六、优缺点
优点:
- 灵活的扩展性,扩展延伸时只需增加新的解释器
- 易于实现的文法
缺点:
- 生成的大量类可能造成后期维护困难;
- 对于复杂的文法构建其抽象语法树会异常繁琐
- 可利用场景比较少