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/天,具体规则查看活动详情