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解释器模式[/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/天,具体规则查看活动详情