java 23种设计模式之行为型模式—解释器模式(23)

java 23种设计模式之行为型模式—解释器模式(23)


从java23种设计模式的第一种:单例模式 java 23种设计模式之创建型—单例模式(1) 

今天

终于将所有的23种设计模式按照自己的学习方式给全部学习、了解了下

由于是额外的自学,所以断断续续的耗时接近10个月

后续,我将整理所有的设计模式源码,免费分享给大家参考学习


什么是解释器模式

解释器模式定义一条语言的规范,然后按照这个规范来解读。

通俗一点就是:

a+b  我定义了中间的加号是表示左右两数相加

那门我们自己就可以通过程序来解释(运行)如下的句子

a+b+c+d


解释器模式有以下几个角色:

1、抽象表达式角色(AbstractExpression): 声明一个抽象的解释操作,这个接口为所有具体表达式角色都要实现的.
2、终结符表达式角色(TerminalExpression): 实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例对应不同的终结符.
3、非终结符表达式角色(NonterminalExpression): 文法中的每条规则对应于一个非终结表达式, 非终结表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式.
4、环境角色(Context): 包含解释器之外的一些全局信息.

下面我们将说明这些词汇的意思


再比如如下一张电路图


[caption id="attachment_1209" align="alignnone" width="292"]java解释器模式 java解释器模式[/caption]


这张图表示了的信息

1、有ABCDE5组电路开关,开表示true,关表示false
2、 AB并联
3、AB和C串联
4、 DE并联
5、DE 和  ABC 并联
用逻辑表达式 表示就是  (A||B && C) || (D || E)

当然您还可以画得更加复杂

我们可以看到图中的并联或串联,他们再表达上只有一种,但是他们却有多种实现,就是说可以被分割,重新组装计算,比如a的b串联、d的e串联、abc、de所以串联和并联是非终结表达式

而每一条线路,他们是无法被分割了,所以他们是终结表达式


以上电路图我们用java程序来实现——解释器模式

1、抽象表达式角色


public abstract class Expression {
	public abstract boolean interpret(Context con);
}


2、终结符表达式角色

/*
 * 终结表达式,即使每一个线路  如A B C D E
 */

public class Constant extends Expression{

	private boolean b;
	
	public Constant(boolean b){
		this.b = b;
	}
	
	@Override
	public boolean interpret(Context con) {
		// TODO Auto-generated method stub
		return this.b;
	}

}


3、非终结符表达式角色——OR

/*
 * 非终结者表达式OR
 */
public class OrExpression extends Expression{
	
	private Expression left , right;
	
	public OrExpression(Expression left ,Expression right){
		this.left = left;
		this.right = right;
	}

	@Override
	public boolean interpret(Context con) {
		// TODO Auto-generated method stub
		return left.interpret(con) || right.interpret(con);
	}

}


3、非终结符表达式角色——AND

/*
 * 非终结者表达式AND
 */
public class AndExpression extends Expression{
	
	private Expression left , right;
	
	public AndExpression(Expression left ,Expression right){
		this.left = left;
		this.right = right;
	}

	@Override
	public boolean interpret(Context con) {
		// TODO Auto-generated method stub
		return left.interpret(con) && right.interpret(con);
	}

}


4、环境角色(Context)


/*
 * 本例模拟电路
 * 现有ABCDE5组电路开关
 * AB并联
 * AB和C串联
 * DE并联
 * DE 和  ABC 并联
 * 表达式 表示就是  (A||B && C) || (D || E)
 */
import java.util.HashMap;
import java.util.Map;

/*
 *  上下文,存储变量的值
 */
public class Context {
	private Map<String, String> map= new HashMap<String, String>();

	public boolean getMap(String key) {
		String a = this.map.get(key);
		return a.equals("true");
	}

	public void setMap(String key, String value) {
		this.map.put(key, value);
	} 
	
}


5、Client



public class Client {
	public static void main(String[] args) {
		Context context = new Context();
		
		//表达式 表示就是  (A||B && C) || (D || E)
		
		context.setMap("a", "false");
		context.setMap("b", "true");
		context.setMap("c", "false");
		context.setMap("d", "false");
		context.setMap("e", "true");
		boolean a = context.getMap("a");
		System.out.println(a);
		
		AndExpression and = new AndExpression(new OrExpression(new Constant(context.getMap("a")),new Constant(context.getMap("b"))), new Constant(context.getMap("c")));
		OrExpression or = new OrExpression(new Constant(context.getMap("d")),new Constant(context.getMap("e")));
		System.out.println(new OrExpression(and,or).interpret(context));
	}
}

文言的表达式可以足够的复杂,但是需要我们自己构建(Client中所表述的那样)。我们就可以计算机计算出我们需要的结果。


爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情Blog Img