国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

java設(shè)計(jì)模式之解釋器模式

這篇具有很好參考價(jià)值的文章主要介紹了java設(shè)計(jì)模式之解釋器模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

解釋器模式(Interpreter Pattern)

1.基本介紹

  1. 在編譯原理中,一個(gè)算術(shù)表達(dá)式通過詞法分析器形成詞法單遠(yuǎn),而這些詞法單遠(yuǎn)再通過語法分析器構(gòu)建語法分析樹,最終形成一顆抽象的語法分析樹,(詞法分析器和語法分析器都可以看做是解釋器)
  2. 解釋器模式是指給定一個(gè)語言(表達(dá)式),定義它的文法的一種表示,并定義一個(gè)解釋器,使用該解釋器來解釋語言中的句子(表達(dá)式)。

2.應(yīng)用場(chǎng)景

  1. 可以將一個(gè)需要解釋執(zhí)行的語言中的句子表示為一個(gè)抽象語法樹。
  2. 一些重復(fù)出現(xiàn)的問題可以用一種簡(jiǎn)單的語言來表達(dá)。
  3. 一個(gè)簡(jiǎn)單語法需要解釋的場(chǎng)景(比如編譯器,運(yùn)算表達(dá)式計(jì)算,正則表達(dá)式,機(jī)器人)。

3.解釋器原理類圖

java設(shè)計(jì)模式之解釋器模式,JAVA 設(shè)計(jì)模式,java,設(shè)計(jì)模式,解釋器模式

說明: 1. Context:是環(huán)境角色,含有解釋器之外的全局信息。
2. AbstractExpression: 抽象表達(dá)式,聲明一個(gè)抽象的解釋操作,這個(gè)方法為抽象語法樹中所有的節(jié)點(diǎn)所共享。
3. TerminalExpression: 為終結(jié)符表達(dá)式,實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)的解釋操作。
4. NonTermialExpression:為非終結(jié)符表達(dá)式,為文法中的非終結(jié)符實(shí)現(xiàn)解釋操作。
5. 輸入(Context he TerminalExpression) 信息通過Client 輸入即可。

4.四則運(yùn)算問題

通過解釋器模式來實(shí)現(xiàn)四則運(yùn)算,如計(jì)算a+b-c的值,具體要求

  1. 先輸入表達(dá)式的形式,比如a+b+c-d+e ,要求表達(dá)式的字母不能重復(fù)。
  2. 在分別輸入a,b,c,d,e的值。
  3. 最后求出結(jié)果:如圖:
    java設(shè)計(jì)模式之解釋器模式,JAVA 設(shè)計(jì)模式,java,設(shè)計(jì)模式,解釋器模式

5.解釋器模式來實(shí)現(xiàn)四則

  1. 要求: 計(jì)算a+b-c的值
  2. 類圖分析
    java設(shè)計(jì)模式之解釋器模式,JAVA 設(shè)計(jì)模式,java,設(shè)計(jì)模式,解釋器模式
  3. 代碼實(shí)現(xiàn)
/**
 * 抽象類表達(dá)式,通過HashMap 鍵值對(duì), 可以獲取到變量的值
 */
public abstract class Expression {
	// a + b - c
	// 解釋公式和數(shù)值, key 就是公式(表達(dá)式) 參數(shù)[a,b,c], value就是就是具體值
	// HashMap {a=10, b=20}
	public abstract int interpreter(HashMap<String, Integer> var);
}

public class Calculator {

	// 定義表達(dá)式
	private Expression expression;

	// 構(gòu)造函數(shù)傳參,并解析
	public Calculator(String expStr) { // expStr = a+b
		// 安排運(yùn)算先后順序
		Stack<Expression> stack = new Stack<>();
		// 表達(dá)式拆分成字符數(shù)組 
		char[] charArray = expStr.toCharArray();// [a, +, b]

		Expression left = null;
		Expression right = null;
		//遍歷我們的字符數(shù)組, 即遍歷  [a, +, b]
		//針對(duì)不同的情況,做處理
		for (int i = 0; i < charArray.length; i++) {
			switch (charArray[i]) {
			case '+': //
				left = stack.pop();// 從stack取出left => "a"
				right = new VarExpression(String.valueOf(charArray[++i]));// 取出右表達(dá)式 "b"
				stack.push(new AddExpression(left, right));// 然后根據(jù)得到left 和 right 構(gòu)建 AddExpresson加入stack
				break;
			case '-': // 
				left = stack.pop();
				right = new VarExpression(String.valueOf(charArray[++i]));
				stack.push(new SubExpression(left, right));
				break;
			default: 
				//如果是一個(gè) Var 就創(chuàng)建要給 VarExpression 對(duì)象,并push到 stack
				stack.push(new VarExpression(String.valueOf(charArray[i])));
				break;
			}
		}
		//當(dāng)遍歷完整個(gè) charArray 數(shù)組后,stack 就得到最后Expression
		this.expression = stack.pop();
	}

	public int run(HashMap<String, Integer> var) {
		//最后將表達(dá)式a+b和 var = {a=10,b=20}
		//然后傳遞給expression的interpreter進(jìn)行解釋執(zhí)行
		return this.expression.interpreter(var);
	}
}

/**
 * 減法解釋器
 */
public class SubExpression extends SymbolExpression {

	public SubExpression(Expression left, Expression right) {
		super(left, right);
	}

	//求出left 和 right 表達(dá)式相減后的結(jié)果
	public int interpreter(HashMap<String, Integer> var) {
		return super.left.interpreter(var) - super.right.interpreter(var);
	}
}

/**
 * 加法解釋器
 */
public class AddExpression extends SymbolExpression  {

	public AddExpression(Expression left, Expression right) {
		super(left, right);
	}

	//處理相加
	//var 仍然是 {a=10,b=20}..
	//一會(huì)我們debug 源碼,就ok
	public int interpreter(HashMap<String, Integer> var) {
		//super.left.interpreter(var) : 返回 left 表達(dá)式對(duì)應(yīng)的值 a = 10
		//super.right.interpreter(var): 返回right 表達(dá)式對(duì)應(yīng)值 b = 20
		return super.left.interpreter(var) + super.right.interpreter(var);
	}
}

/**
 * 變量的解釋器
 */
public class VarExpression extends Expression {

	private String key; // key=a,key=b,key=c

	public VarExpression(String key) {
		this.key = key;
	}

	// var 就是{a=10, b=20}
	// interpreter 根據(jù) 變量名稱,返回對(duì)應(yīng)值
	@Override
	public int interpreter(HashMap<String, Integer> var) {
		return var.get(this.key);
	}
}

public class ClientTest {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		String expStr = getExpStr(); // a+b
		HashMap<String, Integer> var = getValue(expStr);// var {a=10, b=20}
		Calculator calculator = new Calculator(expStr);
		System.out.println("運(yùn)算結(jié)果:" + expStr + "=" + calculator.run(var));
	}

	// 獲得表達(dá)式
	public static String getExpStr() throws IOException {
		System.out.print("請(qǐng)輸入表達(dá)式:");
		return (new BufferedReader(new InputStreamReader(System.in))).readLine();
	}

	// 獲得值映射
	public static HashMap<String, Integer> getValue(String expStr) throws IOException {
		HashMap<String, Integer> map = new HashMap<>();

		for (char ch : expStr.toCharArray()) {
			if (ch != '+' && ch != '-') {
				if (!map.containsKey(String.valueOf(ch))) {
					System.out.print("請(qǐng)輸入" + String.valueOf(ch) + "的值:");
					String in = (new BufferedReader(new InputStreamReader(System.in))).readLine();
					map.put(String.valueOf(ch), Integer.valueOf(in));
				}
			}
		}
		return map;
	}
}

運(yùn)行結(jié)果:
java設(shè)計(jì)模式之解釋器模式,JAVA 設(shè)計(jì)模式,java,設(shè)計(jì)模式,解釋器模式文章來源地址http://www.zghlxwxcb.cn/news/detail-826843.html

6. 注意事項(xiàng)和細(xì)節(jié)

  1. 當(dāng)一個(gè)語言需要解釋中興,可將該語言中的句子表示為一個(gè)抽象語法樹,就可以考慮使用解釋器模式,讓程序具有良好的擴(kuò)展性。
  2. 可能帶來的問題:會(huì)引起類膨脹,解釋器模式采用遞歸調(diào)用方法,將會(huì)導(dǎo)致調(diào)試非常復(fù)雜,效率可能降低。

到了這里,關(guān)于java設(shè)計(jì)模式之解釋器模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式-解釋器設(shè)計(jì)模式

    解釋器模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它用于解釋一種語言或表達(dá)式的語法。該模式主要用于自定義語言解釋、查詢解析和規(guī)則引擎等領(lǐng)域。在解釋器模式中,我們定義了一個(gè)解釋器類,用于解釋和執(zhí)行特定語法規(guī)則的表達(dá)式。 在本篇博客中,我們將詳細(xì)介

    2024年02月09日
    瀏覽(997)
  • 設(shè)計(jì)模式:解釋器模式

    解釋器模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種語言的文法,并且定義了該語言中各個(gè)元素的解釋器。通過使用解釋器,可以解析和執(zhí)行特定的語言表達(dá)式。 解釋器模式的核心思想是將一個(gè)語言的文法表示為一個(gè)類的層次結(jié)構(gòu),并使用該類的實(shí)例來表示

    2024年02月07日
    瀏覽(91)
  • 設(shè)計(jì)模式——解釋器模式

    設(shè)計(jì)模式——解釋器模式

    更多內(nèi)容,前往IT-BLOG 在軟件開發(fā)中,會(huì)遇到有些問題多次重復(fù)出現(xiàn),而且有一定的相似性和規(guī)律性。如果將它們歸納成一種簡(jiǎn)單的表達(dá)式(例如:正則表達(dá)式等),那么這些問題實(shí)例將是該表達(dá)式的一些句子,這樣就可以用 “編譯原理” 中的解釋器模式來實(shí)現(xiàn)。 【1】解釋

    2024年02月03日
    瀏覽(308)
  • 設(shè)計(jì)模式詳解-解釋器模式

    類型:行為型模式 實(shí)現(xiàn)原理:實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口使用標(biāo)識(shí)來解釋語言中的句子 作用:給定一個(gè)語言,定義它的文法表示,并定義一個(gè)解釋器,這個(gè)解釋器來解釋。 主要解決:一些重復(fù)的固定文法分別創(chuàng)建解釋器會(huì)很麻煩 何時(shí)使用:某一種特定類型的問題發(fā)生的

    2024年02月12日
    瀏覽(91)
  • 設(shè)計(jì)模式(23)解釋器模式

    設(shè)計(jì)模式(23)解釋器模式

    一、介紹: 1、定義:解釋器(Interpreter)模式是一種對(duì)象的行為模式。給定一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。 2、組成結(jié)構(gòu): (1)AbstractExpression(抽象表達(dá)式):約定解釋器的解釋操作,主要是一個(gè)interpret()方

    2024年02月06日
    瀏覽(99)
  • 解釋器設(shè)計(jì)模式

    解釋器設(shè)計(jì)模式

    解釋器設(shè)計(jì)模式(Interpreter Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種語言的文法,并建立一個(gè)解釋器來解釋該語言中的句子。這種模式通常用于需要解釋或執(zhí)行一種特定類型的語言的場(chǎng)景,例如編程語言的編譯器或解釋器、規(guī)則引擎系統(tǒng)等。 關(guān)鍵組成部分 抽象表達(dá)式(

    2024年02月21日
    瀏覽(93)
  • 設(shè)計(jì)模式(行為型模式)解釋器模式

    ?? 解釋器模式(Interpreter Pattern) 是一種行為設(shè)計(jì)模式,用于解釋特定語言或處理特定問題領(lǐng)域的語法或表達(dá)式。它定義了一種語言的語法表示,并使用該表示來解釋語言中的句子。通常用于構(gòu)建解析器、編譯器和規(guī)則評(píng)估引擎等場(chǎng)景。 在解釋器模式中,有以下關(guān)鍵角色:

    2024年02月20日
    瀏覽(96)
  • js設(shè)計(jì)模式:解釋器模式

    js設(shè)計(jì)模式:解釋器模式

    對(duì)文本進(jìn)行解釋和編譯的時(shí)候,就會(huì)用到解釋器模式 比如你寫了一段js代碼,js引擎就會(huì)去解釋并執(zhí)行這段代碼 webpack中的各種loader就是用來解釋各種文件類型的,并將其解釋為js可識(shí)別的代碼

    2024年02月22日
    瀏覽(103)
  • 設(shè)計(jì)模式之解釋器模式筆記

    設(shè)計(jì)模式之解釋器模式筆記

    記錄下學(xué)習(xí)設(shè)計(jì)模式-解釋器模式的寫法。JDK使用版本為1.8版本。 意圖 :定義一個(gè)語言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來解釋語言中的句子。 結(jié)構(gòu) : 其中: AbstractExpression 聲明一個(gè)程序的解釋操作,這個(gè)接口為抽象語法樹中所有的結(jié)點(diǎn)所

    2024年02月11日
    瀏覽(94)
  • 設(shè)計(jì)模式之解釋器模式(下)

    設(shè)計(jì)模式之解釋器模式(下)

    3)Context的作用 1.概述 在解釋器模式中,環(huán)境類Context用于存儲(chǔ)解釋器之外的一些全局信息,它通常作為參數(shù)被傳遞到所有表達(dá)式的解釋方法interpret()中,可以在Context對(duì)象中存儲(chǔ)和訪問表達(dá)式解釋器的狀態(tài),向表達(dá)式解釋器提供一些全局的、公共的數(shù)據(jù),此外還可以在Context中

    2024年04月12日
    瀏覽(91)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包