首页 > 代码库 > 大话设计模式_解释器模式(Java代码)
大话设计模式_解释器模式(Java代码)
解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。
简单描述:一个AbstractExpression类,多个子类,存在一个Interpret方法,转义Context对象的信息。客户端根据信息实例化不同的Expression类,并调用其转义方法(这个过程可以使用简单工厂+反射进行)
大话设计模式中的截图:
代码例子:
假设HTML代码解释器:
(1)第一类标签<HTML>(开始)/<HEAD>(头信息)/<BODY>(网页)
(2)第二类标签<BR>(换行)<P>(一段开始)
(3)第三类标签<INPUT>(输入类型)<TEXTAREA>(文本输入框)
为了简化起见,假设得到的html源码标签都用";"分号分割开,只需要打印出标签所代表的意义即可
Context类:
1 package com.longsheng.interpreter; 2 3 public class Context { 4 5 private String htmlStr; 6 7 public void setHtmlStr(String mStr) { 8 htmlStr = mStr; 9 } 10 11 public String getHtmlStr() { 12 return htmlStr; 13 } 14 15 }
AbstractExpression类:
1 package com.longsheng.interpreter; 2 3 public abstract class AbstractExpression { 4 5 public void Interpret(Context mContext) { 6 if (mContext.getHtmlStr() == null 7 || mContext.getHtmlStr().length() == 0) { 8 return; 9 } 10 int position = mContext.getHtmlStr().indexOf(‘;‘); 11 String mark = ""; 12 if( position == -1 ) { 13 mark = mContext.getHtmlStr().substring(0); 14 } else { 15 mark = mContext.getHtmlStr().substring(0, position); 16 } 17 18 mContext.setHtmlStr(mContext.getHtmlStr().substring(position + 1)); 19 exceute(mark); 20 } 21 22 public abstract void exceute(String key); 23 24 }
FirstExpression类:
1 package com.longsheng.interpreter; 2 3 public class FirstExpression extends AbstractExpression { 4 5 @Override 6 public void exceute(String key) { 7 switch(key) { 8 case "HTML": 9 System.out.println("HTML信息"); 10 break; 11 case "HEAD": 12 System.out.println("HEAD信息"); 13 break; 14 case "BODY": 15 System.out.println("BODY信息"); 16 break; 17 default : 18 } 19 } 20 21 }
SecondExpression类:
1 package com.longsheng.interpreter; 2 3 public class SecondExpression extends AbstractExpression { 4 5 @Override 6 public void exceute(String key) { 7 switch(key) { 8 case "BR": 9 System.out.println("换行"); 10 break; 11 case "P": 12 System.out.println("一段开头"); 13 break; 14 default : 15 } 16 } 17 18 }
ThirdExpression类:
1 package com.longsheng.interpreter; 2 3 public class ThirdExpression extends AbstractExpression { 4 5 @Override 6 public void exceute(String key) { 7 switch(key) { 8 case "INPUT": 9 System.out.println("输入"); 10 break; 11 case "TEXTAREA": 12 System.out.println("文本区域"); 13 break; 14 default : 15 } 16 } 17 18 }
客户端代码:
1 package com.longsheng.interpreter; 2 3 public class Client { 4 5 public static void main( String args[] ) { 6 Context mContext = new Context(); 7 AbstractExpression mExpression = null; 8 mContext.setHtmlStr("HTML;HEAD;HEAD;BODY;P;BR;P;BR;TEXTAREA;TEXTAREA;INPUT;BODY;HTML"); 9 String mStr[] = mContext.getHtmlStr().split(";"); 10 for (int i = 0; i < mStr.length; i++) { 11 switch (mStr[i]) { 12 case "HTML": 13 case "HEAD": 14 case "BODY": 15 mExpression = new FirstExpression(); 16 break; 17 case "P": 18 case "BR": 19 mExpression = new SecondExpression(); 20 break; 21 case "TEXTAREA": 22 case "INPUT": 23 mExpression = new ThirdExpression(); 24 break; 25 default: 26 break; 27 } 28 mExpression.Interpret(mContext); 29 } 30 } 31 32 }
运行结果:
1 HTML信息 2 HEAD信息 3 HEAD信息 4 BODY信息 5 一段开头 6 换行 7 一段开头 8 换行 9 文本区域 10 文本区域 11 输入 12 BODY信息 13 HTML信息
如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
使用解释器模式很容易改变和扩展文法,每个类表示一个不同的文法规则,直接继承抽象语法树即可。
解释器为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。当文法非常复杂时,考虑使用其他技术,如语法分析程序或编译器生成器来处理。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。