解释器模式

本文深入解析解释器模式,通过跑步运动的实例,详细介绍模式原理与应用。文章提供了完整的代码实现,包括解释器抽象类、具体类及UML图,帮助读者理解如何根据不同情况灵活组合操作步骤。

摘要

  本文通过简洁的模式描述,应用场景的详细代码实现,以及匹配的UML,详解介绍了解释器模式的原理及应用。本文可帮助读者快速掌握解释器模式,以便工作学习中使用解释器模式。

一、解释器模式

  在生活中,我们的某些行动所包含的步骤是随着当时的情况而定的,比如,一个行动本应该由步骤一、步骤二、步骤三组成,但特殊情况发生,现在这个行动只需要步骤一和步骤三即可完成,所以在这种情况下,不会去做步骤二。
  在编程中,也存在类似的情况,一个操作需要三个步骤才能完成,但是该操作对于某对象只需要两个步骤,或是某些对象需要四个步骤。所以“步骤”与“操作”之间存在变化关系,如果将“步骤”与“操作”写死,会导致一个操作有多个实现,违背了“开闭原则”。
  解释器模式是将每一个“步骤”抽象出来,单独成为一个类,并加入到一个具有存储“步骤”的容器类中。每一个“操作”类,直接对接“步骤”容器类,并从容器中获取每个“操作”类所需的“步骤”进行处理。“步骤”类与“操作”类继承于同一个父类(解释器抽象类),重写该父类的“处理”函数,“步骤”类的“处理”函数则是表明该单一步骤所进行的处理动作,而“操作”类的“处理”函数则是表明该不同情况的“操作”具体类所进行的各步骤处理动作。

二、解释器模式的实现

2.1 场景设计

  现在有跑步运动,原本该运动的步骤有四步,但是Tom只操作了第一步和第二步,而Damon只操作了第三步和第四步。

2.2 代码实现

2.2.1 Expression 解释器抽象类

package ft.patterns.expression;

public interface Expression {
	public String handle(Context context);
}

2.2.2 ExpressionValue “步骤”具体类

package ft.patterns.expression;

public class ExpressionValue implements Expression{
	private String name;
	
	public ExpressionValue(String name) {
		this.name = name;
	}

	@Override
	public String handle(Context context) {
		return context.getExpression(this);
	}
}

2.2.3 ExpressionOption “操作” 解释器抽象类

package ft.patterns.expression;

public abstract class ExpressionOption implements Expression{
	protected Expression one;
	protected Expression two;
	public ExpressionOption(Expression one, Expression two) {
		this.one = one;
		this.two = two;
	}
}

2.2.4 TomRun “操作”解释器具体类

package ft.patterns.expression;

public class TomRun extends ExpressionOption{
	TomRun(Expression one, Expression two){
		super(one, two);
	}

	@Override
	public String handle(Context context) {
		return this.one.handle(context) +"\n"+ this.two.handle(context);
	}
}

2.2.5 DamonRun “操作”解释器具体类

package ft.patterns.expression;

public class DamonRun extends ExpressionOption{
	DamonRun(Expression one, Expression two){
		super(one, two);
	}

	@Override
	public String handle(Context context) {
		return this.one.handle(context) +"\n"+ this.two.handle(context);
	}
}

2.2.6 Context “步骤”容器类

package ft.patterns.expression;

import java.util.HashMap;
import java.util.Map;

public class Context {
	Map<Expression, String> valueMap;
	Context(){
		valueMap = new HashMap<Expression, String>();
	}
	
	public void addExpression(Expression name, String value) {
		valueMap.put(name, value);
	}
	
	public String getExpression(Expression name) {
		return valueMap.get(name);
	}
}

2.2.7 Main 测试类

package ft.patterns.expression;

public class Main {
	public static void main(String[] args) {
		Context context = new Context();
		
		Expression runStep01 = new ExpressionValue("run1");
		Expression runStep02 = new ExpressionValue("run2");
		context.addExpression(runStep01, "step one of Run method.");
		context.addExpression(runStep02, "step two of Run method.");
		
		Expression runStep03 = new ExpressionValue("run3");
		Expression runStep04 = new ExpressionValue("run4");
		context.addExpression(runStep03, "step three of Run method.");
		context.addExpression(runStep04, "step four of Run method.");
		
		TomRun tomRun = new TomRun(runStep01, runStep02);
		System.out.println(tomRun.handle(context));
		
		System.out.println();
		
		DamonRun damonRun = new DamonRun(runStep03, runStep04);
		System.out.println(damonRun.handle(context));
	}
}

2.2.8 测试结果

step one of Run method.
step two of Run method.
step three of Run method.
step four of Run method.

三、解释器模式的UML图

解释器模式UML类图

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值