1 基础知识
1.1 标准定义
解释器(Interpreter)模式标准定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
1.2 分析和说明
解释器(Interpreter)模式属于行为型设计模式。其含义是给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后,使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构,也就是一系列的组合规则。每一个命令对象都有一个解释方法,代表对命令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。
解释器(Interpreter)模式结构如图1所示,其角色包括抽象表达式(AbstractExpression)角色、络结符表达式(Terminal Expression)角色、非终结符表达式(Nonterminal Expression)角色、客户端(Client)角色和环境(Context)角色等。其描述如下。
图1 解释器模式结构
抽象表达式(AbstractExpression)角色:声明一个所有的具体表达式角色都需要实现的抽象接口。这个接口主要是一个interpret()方法,称做解释操作。
络结符表达式(Terminal Expression)角色:这是一个具体角色。实现了抽象表达式角色所要求的接口,主要是一个interpret()方法。文法中的每一个终结符都有一个具体终结表达式与之相对应。
非终结符表达式(Nonterminal Expression)角色:这是一个具体角色。文法中的每一条规则R=R1R2....Rn都需要一个具体的非终结符表达式类。对每一个R=R1R2....Rn中的符号都持有一个静态类型为Expression的实例变量。实现解释操作,即interpret()方法。解释操作以递归方式调用上面所提到的代表R1R2....Rn中的各个符号的实例变量。
客户端(Client)角色:代表模式的客户端它有以下功能。建造一个抽象语法树(AST或者Abstract Syntax Tree)调用解释操作interpret()。在一般情况下,模式还需要一个环境角色。
环境(Context)角色:提供解释器这外的一些全局信息,比如变量的真实量值等。
2 应用场景举例
比如公司接了一个项目,不同的部门对项目有不同的了解。技术部门从技术角度来说明这个项目的情况,而市场部从市场角度来诠释这个项目,财务部门从财务角度来解释这个项目。这就可以采用解释器模式。用例如图2所示。
图2 解释器模式用例图
在这里可以把AbstractExpression类理解为抽象表达式(AbstractExpression)角色。FinancialDepExpression类文件,MarketDepExpression类文件和TechnicalDepExpression类文件是络结符表达式(Terminal Expression)角色。Project类是环境(Context)角色。其实现类图如图3所示。AbstractExpression类为抽象类,FinancialDepExpression具体类,MarketDepExpression具体类和TechnicalDepExpression具体类继承AbstractExpression抽象类。Project类与AbstractExpression类是依赖关系。
图3 解释器模式类图
解释器模式实现顺序图见图4,实现顺序描述:
① 创建一个project1对象;
② 创建一个FinancialDepExpression对象并把project1对象赋值给它;
③ 创建一个MarketDepExpression对象并把project1对象赋值给它;
④ 创建一个TechnicalDepExpression对象并把project1对象赋值给它;
⑤ FinancialDepExpression对象对project1对象进行解释;
⑥ MarketDepExpression对象对project1对象进行解释;
⑦ echnicalDepExpression对象对project1对象进行解释。
图4 解释器模式实现顺序图
3.Java的实现程序代码
Java程序实现主要包括Project类文件,AbstractExpression抽象类文件,FinancialDepExpression类文件,MarketDepExpression类文件和TechnicalDepExpression类文件等5个文件。其关系如图3所示。下面分别列出这5个文件的程序代码,最后列出测试代码并显示输出结果。
Project类程序代码清单01所示。
程序代码清单01
public class Project { private String projectName; public Project(String name) { projectName = name; } public String getProjectName() { return projectName; } public void setProjectName(String projectName) { this.projectName = projectName; } } |
AbstractExpression抽象类程序代码清单02所示。
程序代码清单02
public abstract class AbstractExpression { public void interpret(Project project) { }; } |
FinancialDepExpression类、MarketDepExpression类和TechnicalDepExpression类继承AbstractExpression抽象类,其程序代码清单03所示。
程序代码清单03
public class FinancialDepExpression extends AbstractExpression { public void interpret(Project project) { System.out.println("财务部对" + project.getProjectName() + "的理解。"); } } public class MarketDepExpression extends AbstractExpression { public void interpret(Project project) { System.out.println("市场部对" + project.getProjectName() + "的理解。"); } } public class TechnicalDepExpression extends AbstractExpression { public void interpret(Project project) { System.out.println("技术部对" + project.getProjectName() + "的理解。"); } } |
解释器模式测试程序的代码清单04如下:
程序代码清单04
public class Client { public static void main(String[] args) { Project project1 = new Project("ProjectA"); List<AbstractExpression> expressList = new ArrayList<AbstractExpression>(); expressList.add(new FinancialDepExpression()); expressList.add(new MarketDepExpression()); expressList.add(new TechnicalDepExpression()); for (int i = 0; i < expressList.size(); i++) { expressList.get(i).interpret(project1); } } } |
解释器模式测试类输出结果如下所示:
财务部对ProjectA的理解。 市场部对ProjectA的理解。 技术部对ProjectA的理解。 |
参考链接
11种行为型模式:
Gof23种设计模式(13)——解释器模式(Interpreter)
Gof23种设计模式(14)——模板方法模式(Template Method)
Gof23种设计模式(15)——责任链模式(Chain of Responsibility)
Gof23种设计模式(16)——命令模式(Command)
Gof23种设计模式(17)——迭代器模式(Iterator)
Gof23种设计模式(18)——中介者模式(Mediator)
Gof23种设计模式(19)——备忘录模式(Memento)
Gof23种设计模式(20)——观察者模式(Observer)
Gof23种设计模式(21)——状态模式(State)
Gof23种设计模式(22)——策略模式(Strategy)
Gof23种设计模式(23)——访问者模式(Visitor)
Gof23种设计模式 —— 行为型模式总结和比较
回到总目录:Gof23种设计模式(全解析)
(转载自微信公众号:架构设计模式)