解释器模式
GOF对于解释器模式的定义是:“给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。”
当有一个语言需要被解释继而被执行,并且可以将该语言中的句子表示为一个抽象的语法树时,可以使用解释器模式。
解释器模式通过定义语言的文法,并且会建立一个解释器来解释语言中的句子。
解释器模式主要包含四个角色:
在抽象表达式中声明了抽象的解释操作,他是所有的终结符表达式和非终结符表达式的公共父类。
终结符表达式也是抽象表达式的子类,实现与文法的终结符与之相关联的解释操作
非终结符表达式也是抽象表达式的子类,实现的是文法中非终结符的解释操作。
环境类,又称上下文类,用户存储解释器之外的一些全局信息
解释器模式的主要优点包括易于改变以及拓展文法,并且易于实现文法并增加新的解释表达式的方式;主要缺点是复杂文法难以维护,执行效率较低,应用场景有限。
接下来上代码
package Interpreter2;public abstract class Expression { public void Interpret(Context context) { if(context.getMsgText().length() == 0) { System.out.println("空短信,不做处理"); } else { Operate(context.getMsgText()); } } public abstract void Operate(String msg); }
package Interpreter2;public class NormalMessage extends Expression{ @Override public void Operate(String msg) { // TODO Auto-generated method stub if(msg.contains("面试")) { System.out.println("恭喜收到了面试通知:"+msg); } else { System.out.println("普通短信:"+msg); } } }
package Interpreter2;public class RubbishMessage extends Expression{ @Override public void Operate(String msg) { // TODO Auto-generated method stub if(msg.contains("儿子")) { System.out.println("这是老妈发来的短信"+msg); } else { System.out.println("骗子短信猖獗,系统自动过滤掉啦!"); } } }
package Interpreter2;public class Context { private String msgText; public void setMsgText(String msgText) { this.msgText = msgText; } public String getMsgText() { return msgText; } }
package Interpreter2;import java.util.ArrayList;import java.util.List;public class client { public static void main(String[] args) { Expression ex; Context msgC1 = new Context(); Context msgC2 = new Context(); Context msgC3 = new Context(); msgC1.setMsgText("你好,你来面试吧!"); msgC2.setMsgText("儿子,我给你汇款了!"); msgC3.setMsgText("我,骗子,汇款,打钱给我吧"); List<Context> msgs = new ArrayList<Context>(); msgs.add(msgC1); msgs.add(msgC2); msgs.add(msgC3); for(int i = 0;i<msgs.size();i++) { Context temp = msgs.get(i); if(temp.getMsgText().contains("汇款")) { System.out.println("系统收到了疑似骗子的短信:"+temp.getMsgText()); ex = new RubbishMessage(); ex.Interpret(temp); } else { System.out.println("收到正常的短信:"+temp.getMsgText()); ex = new NormalMessage(); ex.Interpret(temp); } } } }
作者:球球球球笨
链接:https://www.jianshu.com/p/9133984f714a