設計模式21——Interpreter設計模式

Interpreter解釋器設計模式的定義:給定一個語言,定義其文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 java

Interpreter解釋器設計模式角色以下: express

(1).抽象表達式(AbstractExpression)角色:聲明一個全部的具體表達式角色都須要實現的抽象接口。這個接口主要定義一個interpret()方法,稱作解釋操做。 
(2).終結符表達式(TerminalExpression)角色:沒有子節點的表達式。 
(3).非終結符表達式(NonterminalExpression)角色:有子節點的表達式,解釋操做以遞歸方式調用其子節點表達式。  編程

(4).上下文(Context)角色:上下文提供解釋器以外的一些全局信息,好比變量的真實量值等。  設計模式

Interpreter解釋器設計模式結構以下: spa

經過編寫一個模擬java中日期格式化爲指定字符串的例子來演示Interpreter解釋器設計模式,代碼以下: 設計

//抽象表達式
interface AbstractExpression{
    public String format(Date date);
}


//具體的日期格式化表達式
class DataFormatExpression implements AbstractExpression{
    private static final String pattern1 = 「yyyy-MM-dd」; 
    private static final String pattern2 = 「yyyy/MM/dd」;
    private static final Calendar calendar = Calendar.getInstance();
    //默認日期不分隔,如:20120606
    private String separator = 「」;

    public DataFormatExpression(){}

    public DataFormatExpression(String pattern){
        if(pattern1.equals(pattern)){
            separator = 「-」;
        } else if(pattern2.equals(pattern)){
            separator = 「/」;
        }
    }

    public String getYear(Calendar cal){
    return cal.get(Calendar.YEAR) + 「」;
    }

    public String getMonth(Calendar cal){
        int month = cal.get(Calendar.MONTH) + 1;
        return month < 10 ? 「0」 + month : 「」 + month;
    }

    public String getDay(Calendar cal){
        int day = cal.get(Calendar.DAY_OF_MONTH);
        return day < 10 ? 「0」 + day : 「」 + day;
    }

    public String format(Date date){
        calendar.setTime(date);
        return getYear(calendar) + separator + getMonth(calendar) + separator + getDay(calendar);
    }
}


public class InterpreterDemo{
    public static void main(String[] args){
        Date date = new Date();
        AbstractExpression expression1 = new DataFormatExpression()
        System.out.println(expression1.format(date));
	
        AbstractExpression expression2 = new DataFormatExpression(「yyyy-MM-dd」)
        System.out.println(expression2.format(date));

        AbstractExpression expression3 = new DataFormatExpression(「yyyy/MM/dd」)
        System.out.println(expression3.format(date));
    }
}

Interpreter解釋器設計模式的應用場景: code

在軟件構建過程當中,若果某一特定領域的問題比較複雜,相似的模式不斷重複出現,若是使用普通的編程方式來實現將面臨很是頻繁的變化。在這種狀況下,將特定領域的問題表達爲某種語法規則下的句子,再構建一個解釋器來解釋這樣的句子,從而達到解決問題的目的。 orm

JDK中解釋器模式的應用: 遞歸

java.util.Pattern
java.text.Normalizer
java.text.DateFormat
java.text.MessageFormat
java.text.NumberFormat
相關文章
相關標籤/搜索