亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

深入淺出基于Java的解釋器設計模式

2019-11-18 11:37:12
字體:
來源:轉載
供稿:網友
一、引子

  其實沒有什么好的例子引入解釋器模式,因為它描述了如何構成一個簡單的語言解釋器,主要應用在使用面向對象語言開發編譯器中;在實際應用中,我們可能很少碰到去構造一個語言的文法的情況。

  雖然你幾乎用不到這個模式,但是看一看還是能受到一定的啟發的。

  二、定義與結構

  解釋器模式的定義如下:定義語言的文法,并且建立一個解釋器來解釋該語言中的句子。它屬于類的行為模式。這里的語言意思是使用規定格式和語法的代碼。

  在GOF的書中指出:假如一種特定類型的問題發生的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題。而且當文法簡單、效率不是要害問題的時候效果最好。

  這也就是解釋器模式應用的環境了。

  讓我們來看看神秘的解釋器模式是由什么來組成的吧。

  1) 抽象表達式角色:聲明一個抽象的解釋操作,這個接口為所有具體表達式角色(抽象語法樹中的節點)都要實現的。

  什么叫做抽象語法樹呢?《java與模式》中給的解釋為:抽象語法樹的每一個節點都代表一個語句,而在每個節點上都可以執行解釋方法。這個解釋方法的執行就代表這個語句被解釋。由于每一個語句都代表這個語句被解釋。由于每一個語句都代表一個常見的問題的實例,因此每一個節點上的解釋操作都代表對一個問題實例的解答。

  2) 終結符表達式角色:具體表達式。

  a) 實現與文法中的終結符相關聯的解釋操作

  b) 而且句子中的每個終結符需要該類的一個實例與之對應

  3) 非終結符表達式角色:具體表達式。

  a) 文法中的每條規則R::=R1R2…Rn都需要一個非終結符表帶式角色

  b) 對于從R1到Rn的每個符號都維護一個抽象表達式角色的實例變量

  c) 實現解釋操作,解釋一般要遞歸地調用表示從R1到Rn的那些對象的解釋操作

  4) 上下文(環境)角色:包含解釋器之外的一些全局信息。

  5) 客戶角色:

  a) 構建(或者被給定)表示該文法定義的語言中的一個特定的句子的抽象語法樹

  b) 調用解釋操作

  放上張解釋器結構類圖吧,這也是來自于GOF的書中。

深入淺出基于Java的解釋器設計模式

  對每一個角色都給出了具體的職責,而且在類圖中給出五個角色之間的關系。這樣實現起來也不是很困難了,下面舉了一個簡單的例子,希望能加深你對解釋器模式的理解。
QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題

三、舉例

  來舉一個加減乘除的例子吧,實現思路來自于《java與模式》中的例子。每個角色的功能按照上面提到的規范來實現。

//上下文(環境)角色,使用HashMap來存儲變量對應的數值

class Context
{
 PRivate Map valueMap = new HashMap();
 public void addValue(Variable x , int y)
 {
  Integer yi = new Integer(y);
  valueMap.put(x , yi);
 }

 public int LookupValue(Variable x)
 {
  int i = ((Integer)valueMap.get(x)).intValue();
  return i ;
 }
}

//抽象表達式角色,也可以用接口來實現

abstract class EXPression
{
 public abstract int interpret(Context con);
}

//終結符表達式角色

class Constant extends Expression
{
 private int i ;
 public Constant(int i)
 {
  this.i = i;
 }

 public int interpret(Context con)
 {
  return i ;
 }
}

class Variable extends Expression
{
 public int interpret(Context con)
 {
  //this為調用interpret方法的Variable對象
  return con.LookupValue(this);
 }
}

//非終結符表達式角色

class Add extends Expression
{
 private Expression left ,right ;
 public Add(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  return left.interpret(con) + right.interpret(con);
 }
}

class SuBTract extends Expression
{
 private Expression left , right ;
 public Subtract(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  return left.interpret(con) - right.interpret(con);
 }

}

class Multiply extends Expression
{
 private Expression left , right ;
 public Multiply(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }
 public int interpret(Context con)
 {
  return left.interpret(con) * right.interpret(con);
 }
}

class Division extends Expression
{
 private Expression left , right ;
 public Division(Expression left , Expression right)
 {
  this.left = left ;
  this.right= right ;
 }

 public int interpret(Context con)
 {
  try{
   return left.interpret(con) / right.interpret(con);
  }catch(ArithmeticException ae)
  {
   System.out.println("被除數為0!");
   return -11111;
  }
 }
}

//測試程序,計算 (a*b)/(a-b+2)

public class Test
{
 private static Expression ex ;
 private static Context con ;
 public static void main(String[] args)
 {
  con = new Context();
  //設置變量、常量
  Variable a = new Variable();
  Variable b = new Variable();
  Constant c = new Constant(2);
  //為變量賦值
  con.addValue(a , 5);
  con.addValue(b , 7);
  //運算,對句子的結構由我們自己來分析,構造
  ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c));
  System.out.println("運算結果為:"+ex.interpret(con));
 }
}
  解釋器模式并沒有說明如何創建一個抽象語法樹,因此它的實現可以多種多樣,在上面我們是直接在Test中提供的,當然還有更好、更專業的實現方式。

  對于終結符,GOF建議采用享元模式來共享它們的拷貝,因為它們要多次重復出現。但是考慮到享元模式的使用局限性,我建議還是當你的系統中終結符重復的足夠多的時候再考慮享元模式。

  四、優缺點

  解釋器模式提供了一個簡單的方式來執行語法,而且輕易修改或者擴展語法。一般系統中很多類使用相似的語法,可以使用一個解釋器來代替為每一個規則實現一個解釋器。而且在解釋器中不同的規則是由不同的類來實現的,這樣使得添加一個新的語法規則變得簡單。

  但是解釋器模式對于復雜文法難以維護??梢韵胂笠幌?,每一個規則要對應一個處理類,而且這些類還要遞歸調用抽象表達式角色,多如亂麻的類交織在一起是多么恐怖的一件事啊!

  五、總結

  這樣對解釋器模式應該有了些大體的熟悉了吧,由于這個模式使用的案例匱乏,所以本文大部分觀點直接來自于GOF的原著。只是實例代碼是親自實現并調試通過的。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美又大又粗又长| 中文字幕少妇一区二区三区| 欧美与黑人午夜性猛交久久久| 欧美黄色片在线观看| 欧美成人剧情片在线观看| 亚洲网在线观看| 色伦专区97中文字幕| 久久不射热爱视频精品| 日韩免费在线电影| 国产精品极品在线| 亚洲欧美制服丝袜| 性色av一区二区三区红粉影视| 色婷婷亚洲mv天堂mv在影片| 亚洲成在人线av| 蜜臀久久99精品久久久久久宅男| 精品久久国产精品| 日韩精品在线观看一区二区| 国产精品视频1区| 欧美精品福利视频| 亚洲欧美日韩中文视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲91精品在线| 欧美亚洲国产日韩2020| 欧美激情第1页| 久久久在线观看| 久久国产精品久久久久久| 亚洲理论在线a中文字幕| 亚洲精选在线观看| 91久久国产综合久久91精品网站| 久久夜精品va视频免费观看| 激情久久av一区av二区av三区| 欧美专区国产专区| 黑人巨大精品欧美一区免费视频| 欧美国产视频日韩| 中文字幕精品视频| 一本色道久久综合狠狠躁篇的优点| 中文字幕欧美视频在线| 成人免费视频在线观看超级碰| 一本大道香蕉久在线播放29| 日韩中文字幕网| 亚洲一区二区免费在线| 欧美麻豆久久久久久中文| 91免费看国产| 国产丝袜精品第一页| 久久久久久久999精品视频| 91精品视频免费看| 日韩欧美在线免费观看| 奇米一区二区三区四区久久| 久久偷看各类女兵18女厕嘘嘘| 国产精品一区二区三区在线播放| 欧美日韩亚洲一区二区| 91chinesevideo永久地址| 亚洲视频精品在线| 国产区精品视频| www.久久色.com| 亚洲国产精品福利| 精品久久久久久中文字幕| 久久艳片www.17c.com| 精品无码久久久久久国产| 欧美日韩ab片| 久久久精品欧美| 亚洲xxxx妇黄裸体| 欧美黑人一区二区三区| 日韩欧美成人网| 精品久久久久久久大神国产| 日韩高清电影好看的电视剧电影| 91在线高清视频| 欧美在线一区二区三区四| 国外色69视频在线观看| 97视频在线观看亚洲| 欧美国产中文字幕| 日韩成人中文字幕在线观看| 国产精品自在线| 国产视频精品xxxx| 欧美精品激情在线| 最好看的2019的中文字幕视频| 亚洲一区二区三区乱码aⅴ| 久久久视频免费观看| 欧美视频在线看| 日韩欧美有码在线| 国产不卡视频在线| 久久九九亚洲综合| 久久国产精品久久久久久久久久| 亚洲欧洲国产精品| 日韩激情片免费| 日韩av在线免费观看一区| 97免费在线视频| 国内揄拍国内精品少妇国语| 久久精品成人欧美大片| 日韩精品中文字幕有码专区| 亚洲色图国产精品| 国产亚洲欧洲高清| 精品福利在线看| 91成人天堂久久成人| 亚洲国产精品久久| 国产精品成久久久久三级| 国产精品海角社区在线观看| 欧美视频裸体精品| 亚洲欧洲美洲在线综合| 日韩高清不卡av| 久久久久久亚洲精品不卡| 欧美日韩精品在线播放| 久久69精品久久久久久久电影好| 97久久精品国产| 欧美日本中文字幕| 色噜噜亚洲精品中文字幕| 国产成人在线精品| 国产日韩欧美另类| 国产精品久久一| 国产精品欧美一区二区| 中文字幕在线日韩| 日本高清不卡在线| 日韩av在线电影网| 国产精品高精视频免费| 欧美日韩午夜剧场| 黄色成人av在线| 亚洲国产精品va在线看黑人动漫| 亚洲国产毛片完整版| 91日本视频在线| 欧美成aaa人片在线观看蜜臀| 综合国产在线观看| 亚洲性无码av在线| 成人亚洲欧美一区二区三区| 欧美午夜女人视频在线| 一本一本久久a久久精品综合小说| 自拍亚洲一区欧美另类| 国产精品嫩草视频| 日本久久亚洲电影| 5566日本婷婷色中文字幕97| 亚洲天堂av图片| 成人综合国产精品| 中文字幕亚洲二区| 亚洲欧洲中文天堂| 国产精品普通话| 国产亚洲在线播放| 久久99国产精品自在自在app| 91欧美精品成人综合在线观看| 国产精品亚洲片夜色在线| 午夜免费久久久久| 亚洲国产黄色片| 69久久夜色精品国产7777| 欧美乱大交做爰xxxⅹ性3| 96sao精品视频在线观看| 亚洲黄色www网站| 在线播放日韩专区| 亚洲尤物视频网| 成人伊人精品色xxxx视频| 这里只有精品在线观看| 777精品视频| 亚洲天堂第二页| 国产精品久久久久久婷婷天堂| 日本国产欧美一区二区三区| 中文字幕亚洲图片| 国产精品三级美女白浆呻吟| 欧美一区二区三区四区在线| 亚洲激情久久久| 蜜臀久久99精品久久久久久宅男| 91情侣偷在线精品国产| 性欧美亚洲xxxx乳在线观看| 欧美重口另类videos人妖| 欧美高清不卡在线| 国产成+人+综合+亚洲欧美丁香花| 国产一区视频在线| 欧美成人亚洲成人|