學習札記:設計模式之解釋器模式

一.什麼是解釋器模式

給定一個語言,定義文法表示,並定義一個解釋器去解釋定義的句子。

二.解釋器模式的寫法

解釋器模式,主要有抽象的解釋器,終結表達式,非終結表達式和上下文。如果按輸入字符串得到結果的計算器來理解,抽象的解釋器定義任務也就是得到的結果,終結表達式表達的是字符對應的數字的解釋操作,一般只有一個,而非終結的表達式有點像各種各樣的符號計算順便返回結果。上下文環境則是定義包含解釋操作的其他環境。
這次我們看看代碼,我們先定義一個抽象的解釋器,持有上下文引用。

public abstract class AbstractExpression {
	protected abstract double interprete(Context context);
}

再來定義一組非終結表達式

/**
 * 非終結表達式
 * @author Seven
 *
 */
public abstract class NonTerminalExpression extends AbstractExpression{
	
	protected AbstractExpression expression1,expression2;

	public NonTerminalExpression(AbstractExpression expression1, AbstractExpression expression2) {
		super();
		this.expression1 = expression1;
		this.expression2 = expression2;
	}

}
/**
 * 加法表達式
 * @author Seven
 *
 */
public class PlusExpression extends NonTerminalExpression{

	public PlusExpression(AbstractExpression expression1, AbstractExpression expression2) {
		super(expression1, expression2);
	
	}

	@Override
	protected double interprete(Context context) {
		
		return expression1.interprete(context)+expression2.interprete(context);
	}

}
/**
 * 減法表達式
 * @author Seven
 *
 */
public class MinusExpression extends NonTerminalExpression{

	public MinusExpression(AbstractExpression expression1, AbstractExpression expression2) {
		super(expression1, expression2);
	
	}

	@Override
	protected double interprete(Context context) {
		
		
		return expression1.interprete(context)-expression2.interprete(context);

		
	}

}

我們再來定義一個終結表達式


/** 終結表達式
 * @author Seven
 *
 */
public class TerminalExpression extends AbstractExpression{

	String var;
	public TerminalExpression(String var) {
		super();
		this.var = var;
	}

	@Override
	protected double interprete(Context context) {
		return context.lookup(this);
		
		
	}

}

我們再來看看客戶端測試

public class Client {

	public static void main(String[] args) {
		Context context = new Context();
		TerminalExpression a = new TerminalExpression("a");
		TerminalExpression b = new TerminalExpression("b");
		TerminalExpression c = new TerminalExpression("c");
		context.add(a, 4.0);
		context.add(b, 8.0);
		context.add(c, 2.0);
		// 以上定義將終結表達式所表示的內容一一對應起來,並放到上下文環境中。可以理解爲也就是定義文法,解釋器的規則。

		AbstractExpression abstractExpression = new MinusExpression(b, c); 
		System.out.println(abstractExpression.interprete(context));  //得到結果6

		AbstractExpression abstractExpression1 = new PlusExpression(b, c);
		System.out.println(abstractExpression1.interprete(context));//得到結果10

		AbstractExpression abstractExpression2 = new PlusExpression(abstractExpression, c); 
		System.out.println(abstractExpression2.interprete(context));//先執行abstractExpression的interprete得到結果6,在減去c的interpreter得到的值 然後得到結果8

//	        System.out.println(new MinusExpression(new PlusExpression(a,b), c).interprete(context));
	}

}

三.小結

以上就是一個解釋器模式的代碼寫法,解釋器模式是爲了解決一些文法的表達和轉換,採用的是一種遞歸調用,所以看上去不是很好理解,看下最後一個的測試代碼。當我們有一些簡單的文法表達式可使用解釋器模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章