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

首頁 > 編程 > Java > 正文

JAVA設計模式之解釋器模式詳解

2019-11-26 15:13:54
字體:
來源:轉載
供稿:網友

在閻宏博士的《JAVA與模式》一書中開頭是這樣描述解釋器(Interpreter)模式的:

解釋器模式是類的行為模式。給定一個語言之后,解釋器模式可以定義出其文法的一種表示,并同時提供一個解釋器??蛻舳丝梢允褂眠@個解釋器來解釋這個語言中的句子。

解釋器模式的結構

  下面就以一個示意性的系統為例,討論解釋器模式的結構。系統的結構圖如下所示:

模式所涉及的角色如下所示:

 ?。?)抽象表達式(Expression)角色:聲明一個所有的具體表達式角色都需要實現的抽象接口。這個接口主要是一個interpret()方法,稱做解釋操作。

 ?。?)終結符表達式(Terminal Expression)角色:實現了抽象表達式角色所要求的接口,主要是一個interpret()方法;文法中的每一個終結符都有一個具體終結表達式與之相對應。比如有一個簡單的公式R=R1+R2,在里面R1和R2就是終結符,對應的解析R1和R2的解釋器就是終結符表達式。

 ?。?)非終結符表達式(Nonterminal Expression)角色:文法中的每一條規則都需要一個具體的非終結符表達式,非終結符表達式一般是文法中的運算符或者其他關鍵字,比如公式R=R1+R2中,“+"就是非終結符,解析“+”的解釋器就是一個非終結符表達式。

 ?。?)環境(Context)角色:這個角色的任務一般是用來存放文法中各個終結符所對應的具體值,比如R=R1+R2,我們給R1賦值100,給R2賦值200。這些信息需要存放到環境角色中,很多情況下我們使用Map來充當環境角色就足夠了。


 為了說明解釋器模式的實現辦法,這里給出一個最簡單的文法和對應的解釋器模式的實現,這就是模擬Java語言中對布爾表達式進行操作和求值。

  在這個語言中終結符是布爾變量,也就是常量true和false。非終結符表達式包含運算符and,or和not等布爾表達式。這個簡單的文法如下:

復制代碼 代碼如下:

    Expression  ::= Constant | Variable | Or | And | Not

    And     ::= Expression 'AND' Expression

    Or     ::= Expression 'OR' Expression

    Not     ::= 'NOT' Expression

    Variable  ::= 任何標識符

    Constant    ::= 'true' | 'false'

解釋器模式的結構圖如下所示:

源代碼

  抽象表達式角色

復制代碼 代碼如下:

public abstract class Expression {
    /**
     * 以環境為準,本方法解釋給定的任何一個表達式
     */
    public abstract boolean interpret(Context ctx);
    /**
     * 檢驗兩個表達式在結構上是否相同
     */
    public abstract boolean equals(Object obj);
    /**
     * 返回表達式的hash code
     */
    public abstract int hashCode();
    /**
     * 將表達式轉換成字符串
     */
    public abstract String toString();
}

  一個Constant對象代表一個布爾常量

復制代碼 代碼如下:

public class Constant extends Expression{
   
    private boolean value;

    public Constant(boolean value){
        this.value = value;
    }
   
    @Override
    public boolean equals(Object obj) {
       
        if(obj != null && obj instanceof Constant){
            return this.value == ((Constant)obj).value;
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.toString().hashCode();
    }

    @Override
    public boolean interpret(Context ctx) {
       
        return value;
    }

    @Override
    public String toString() {
        return new Boolean(value).toString();
    }
   
}

一個Variable對象代表一個有名變量

復制代碼 代碼如下:

public class Variable extends Expression {

    private String name;

    public Variable(String name){
        this.name = name;
    }
    @Override
    public boolean equals(Object obj) {
       
        if(obj != null && obj instanceof Variable)
        {
            return this.name.equals(
                    ((Variable)obj).name);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.toString().hashCode();
    }

    @Override
    public String toString() {
        return name;
    }

    @Override
    public boolean interpret(Context ctx) {
        return ctx.lookup(this);
    }

}

代表邏輯“與”操作的And類,表示由兩個布爾表達式通過邏輯“與”操作給出一個新的布爾表達式的操作

復制代碼 代碼如下:

public class And extends Expression {

    private Expression left,right;
   
    public And(Expression left , Expression right){
        this.left = left;
        this.right = right;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof And)
        {
            return left.equals(((And)obj).left) &&
                right.equals(((And)obj).right);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.toString().hashCode();
    }

    @Override
    public boolean interpret(Context ctx) {
       
        return left.interpret(ctx) && right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " AND " + right.toString() + ")";
    }

}

  代表邏輯“或”操作的Or類,代表由兩個布爾表達式通過邏輯“或”操作給出一個新的布爾表達式的操作

復制代碼 代碼如下:

public class Or extends Expression {
    private Expression left,right;

    public Or(Expression left , Expression right){
        this.left = left;
        this.right = right;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof Or)
        {
            return this.left.equals(((Or)obj).left) && this.right.equals(((Or)obj).right);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.toString().hashCode();
    }

    @Override
    public boolean interpret(Context ctx) {
        return left.interpret(ctx) || right.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(" + left.toString() + " OR " + right.toString() + ")";
    }

}

  代表邏輯“非”操作的Not類,代表由一個布爾表達式通過邏輯“非”操作給出一個新的布爾表達式的操作

復制代碼 代碼如下:

public class Not extends Expression {

    private Expression exp;
   
    public Not(Expression exp){
        this.exp = exp;
    }
    @Override
    public boolean equals(Object obj) {
        if(obj != null && obj instanceof Not)
        {
            return exp.equals(
                    ((Not)obj).exp);
        }
        return false;
    }

    @Override
    public int hashCode() {
        return this.toString().hashCode();
    }

    @Override
    public boolean interpret(Context ctx) {
        return !exp.interpret(ctx);
    }

    @Override
    public String toString() {
        return "(Not " + exp.toString() + ")";
    }

}

  環境(Context)類定義出從變量到布爾值的一個映射

復制代碼 代碼如下:

public class Context {

    private Map<Variable,Boolean> map = new HashMap<Variable,Boolean>();
   
    public void assign(Variable var , boolean value){
        map.put(var, new Boolean(value));
    }
   
    public boolean lookup(Variable var) throws IllegalArgumentException{
        Boolean value = map.get(var);
        if(value == null){
            throw new IllegalArgumentException();
        }
        return value.booleanValue();
    }
}

客戶端類

復制代碼 代碼如下:

public class Client {

    public static void main(String[] args) {
        Context ctx = new Context();
        Variable x = new Variable("x");
        Variable y = new Variable("y");
        Constant c = new Constant(true);
        ctx.assign(x, false);
        ctx.assign(y, true);
       
        Expression exp = new Or(new And(c,x) , new And(y,new Not(x)));
        System.out.println("x=" + x.interpret(ctx));
        System.out.println("y=" + y.interpret(ctx));
        System.out.println(exp.toString() + "=" + exp.interpret(ctx));
    }

}

運行結果如下:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人综合精品在线| 2019国产精品自在线拍国产不卡| 26uuu久久噜噜噜噜| 国产精品久久久久久久久久久久久| 亚洲裸体xxxx| 亚洲精品国产综合区久久久久久久| 在线播放日韩精品| 国内免费精品永久在线视频| 中文字幕亚洲欧美日韩高清| 日韩在线视频网| 欧美激情久久久久| 欧美性生活大片免费观看网址| 萌白酱国产一区二区| 欧美电影在线观看| 国产一区二区三区在线| 国产成人精品在线播放| 欧美国产日韩二区| 日韩欧美国产中文字幕| 韩剧1988免费观看全集| 成人精品视频99在线观看免费| 亚洲成人免费网站| 欧美激情中文字幕在线| 色综合久久88| 欧美精品一区二区三区国产精品| 成人自拍性视频| 中文字幕视频一区二区在线有码| 九九热精品在线| 欧美激情一区二区三区成人| 久久99热精品| 亚洲国产黄色片| 亚洲香蕉av在线一区二区三区| 久久久久久久久综合| 亚洲片在线资源| 欧美日韩在线视频观看| 亚洲欧美日韩一区在线| 欧美日韩999| 国内久久久精品| 国语自产精品视频在线看一大j8| 色一情一乱一区二区| 久久久在线观看| 国产精品入口免费视频一| 久久久噜噜噜久噜久久| 免费91麻豆精品国产自产在线观看| 久久精品国产亚洲7777| 亚洲视频国产视频| 亚洲欧美一区二区三区久久| 日本精品久久久久久久| 久久伊人精品天天| 久久精彩免费视频| 国产精品久久电影观看| 亚洲无亚洲人成网站77777| 日韩高清欧美高清| 俺也去精品视频在线观看| 亚洲另类欧美自拍| 91色视频在线导航| zzijzzij亚洲日本成熟少妇| 欧美天堂在线观看| 亚洲自拍欧美色图| 国产精品久久久久影院日本| 欧美亚州一区二区三区| 91av视频导航| 亚洲欧洲一区二区三区久久| 亚洲国产精品久久精品怡红院| 国语自产偷拍精品视频偷| 夜夜躁日日躁狠狠久久88av| 亚洲综合成人婷婷小说| 亚洲深夜福利在线| 欧美丝袜一区二区三区| 精品久久久在线观看| 黑人狂躁日本妞一区二区三区| 久久久久久有精品国产| 国产精品亚洲视频在线观看| 久久亚洲精品国产亚洲老地址| 在线视频亚洲欧美| 精品亚洲精品福利线在观看| 久久天天躁夜夜躁狠狠躁2022| 性欧美长视频免费观看不卡| 日韩在线观看免费| 夜夜狂射影院欧美极品| 日本一区二区三区在线播放| 欧美亚洲视频一区二区| 成人久久久久久| 欧美日韩福利在线观看| 亚洲r级在线观看| 性欧美亚洲xxxx乳在线观看| 亚洲肉体裸体xxxx137| 久久夜色精品国产欧美乱| 亚洲网站在线播放| 在线观看欧美日韩国产| 欧美多人爱爱视频网站| 日韩在线免费观看视频| 亚洲一区二区免费| 国产一区二区香蕉| 91在线无精精品一区二区| 日韩成人av在线播放| 在线免费观看羞羞视频一区二区| 久久激情视频久久| 最新日韩中文字幕| 8050国产精品久久久久久| 国产欧美亚洲视频| 日本成人激情视频| 日韩欧美亚洲范冰冰与中字| 福利视频一区二区| 91精品国产沙发| 亚洲乱码av中文一区二区| 欧美成人免费一级人片100| 国产精品高潮呻吟久久av黑人| 91福利视频在线观看| 国产99久久精品一区二区永久免费| 亚洲福利视频网站| 欧美国产亚洲精品久久久8v| 亚洲国产精品一区二区久| 136fldh精品导航福利| 亚洲人成欧美中文字幕| 国产有码在线一区二区视频| 国产精品亚洲片夜色在线| 蜜月aⅴ免费一区二区三区| 日韩欧美在线中文字幕| 成人性生交大片免费看小说| 粗暴蹂躏中文一区二区三区| 亚洲无线码在线一区观看| 亚洲电影成人av99爱色| 欧美日韩福利电影| 黄网动漫久久久| 欧美巨猛xxxx猛交黑人97人| 久久免费少妇高潮久久精品99| 一道本无吗dⅴd在线播放一区| 日本高清视频精品| 国产成人精品久久二区二区91| 欧美亚洲国产另类| 狠狠躁18三区二区一区| 69**夜色精品国产69乱| 成人国产精品一区| 亚洲91av视频| 欧美日韩xxx| 好吊成人免视频| 日韩精品黄色网| 日韩精品欧美激情| 夜夜嗨av一区二区三区免费区| 亚洲免费精彩视频| 亚洲激情电影中文字幕| 5566日本婷婷色中文字幕97| 亚洲精品免费一区二区三区| 91久久精品美女高潮| 欧美人在线观看| 中文字幕一区二区三区电影| 国产一区二区三区在线免费观看| 91成人在线视频| 91chinesevideo永久地址| 久久国产精品偷| 亚洲视频精品在线| 色婷婷综合成人| 日本久久91av| 亚洲xxxxx电影| 一区二区三区美女xx视频| 日本精品免费一区二区三区| 中文字幕av一区中文字幕天堂| 亚洲精品中文字幕av| 午夜精品在线观看| 国产精品xxx视频| 欧美日韩日本国产| 欧美性猛交xxxx免费看| 欧美大片第1页| 久久影视电视剧免费网站|