解释器模式(Interpreter):给定一个语言,定义他的文法表示,并且定义一个解释器,
这个解释器使用该表示来解释语言中的句子。
解释器模式需要解决的是,如果一种特定语言类型的问题发生的频率足够高,那么可能
就值得将改问题的各个实例表示为一个简单语言中的句子。这样就构成一个解释器,
该解释器通过解释这些句子来解决该问题。
其实我感觉解释器模式更加注重的是一种思想,它把用的频率很高的实例简化出来,这样
既能够节省内存空间,由不会增加代码复杂度。
其实程序设计里面的常量就是运用这一思想,既然很多地方用,就干村把它定义成一个全局
的不可变的常量,在需要时直接以变量代替而不是整个表达式。
下面看类图(注重解释的思想而不要局限于类图):
类图比较简单,仅仅是两个子类去完成不同的解释工作,
下面看具体类代码实现:
AbstractExpression类:
package com.blog.anla.Interpreter;
public abstract class AbstractExpression {
public abstract void interpret(Context context);
}
Context类:
package com.blog.anla.Interpreter;
/**
* 包含解释器之外的全局信息
* @author U-ANLA
*
*/
public class Context {
private String input;
private String output;
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getOutput() {
return output;
}
public void setOutput(String output) {
this.output = output;
}
}
TerminalExpression类:
package com.blog.anla.Interpreter;
public class TerminalExpression extends AbstractExpression{
@Override
public void interpret(Context context) {
System.out.println("终端解释器相关逻辑代码");
}
}
NonterminalExpression类:
package com.blog.anla.Interpreter;
public class NonterminalExpression extends AbstractExpression{
@Override
public void interpret(Context context) {
System.out.println("非终端解释器相关逻辑操作。");
}
}
Client类:
package com.blog.anla.Interpreter;
import java.util.ArrayList;
import java.util.List;
public class Client {
public static void main(String[] args) {
Context context = new Context();
List<AbstractExpression> list = new ArrayList<AbstractExpression>();
list.add(new TerminalExpression());
list.add(new NonterminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
//一一执行
for(int i = 0;i < list.size();i++){
list.get(i).interpret(context);
}
}
}
这个还是比较好理解的,
注重解释器的思想,而不要仅仅局限于类代码结构。
赠人玫瑰手留余香(oo)
设计模式相关代码以及类图的整个项目都托管到了github上,包括各个模式的示例
代码以及类图,类图则用的visio绘制,整个visio文件也在该项目上,这里贴上地址:
https://github.com/anLA7856/design
如果觉得有帮助,start一下呗~我会非常开心的