Java设计模式 - 解释器模式

文章目录

背景

变形能够改变形态,进而各个属性都有所改变。合体将多个机体组合起来,变得更加强大。本案例模拟变形和合体的运算,来实现解释者模式。

实现

表达式接口

public interface Expression {

	String interpreter();
	
}

终结表达式:代表着机体的名称

/**
 * 终结符:代表着机体的名称
 */
public class RobotTerminalExpression implements Expression {
	
	private String name;
	
	public RobotTerminalExpression(String name) {
		super();
		this.name = name;
	}

	@Override
	public String interpreter() {
		return name;
	}

}

非终结表达式:变形

/**
 * 非终结符:变形操作
 */
public class TransformNonTerminalExpression implements Expression {
	
	private Expression exp;

	public TransformNonTerminalExpression(Expression exp) {
		super();
		this.exp = exp;
	}

	public Expression getExp() {
		return exp;
	}

	public void setExp(Expression exp) {
		this.exp = exp;
	}

	@Override
	public String interpreter() {
		String transformTo = "";
		switch (exp.interpreter()) {
		case "R1":
			transformTo = "R-Wing";
			break;
		case "野生兽":
			transformTo = "野生兽(FM)";
			break;
		default:
			transformTo = "非法的变形操作!";
			break;
		}
		
		return transformTo;
	}

}

非终结表达式:合体

/**
 * 非终结符-》合体操作
 */
public class CombineNonTerminalExpression implements Expression {
	
	private Expression exp1;
	
	private Expression exp2;
	
	private Expression exp3;
	
	public CombineNonTerminalExpression(Expression exp1, Expression exp2) {
		super();
		this.exp1 = exp1;
		this.exp2 = exp2;
	}

	public CombineNonTerminalExpression(Expression exp1, Expression exp2, Expression exp3) {
		super();
		this.exp1 = exp1;
		this.exp2 = exp2;
		this.exp3 = exp3;
	}

	@Override
	public String interpreter() {
		if ("R1".equals(exp1.interpreter()) && "R2".equals(exp2.interpreter()) && "R3".equals(exp3 == null? "" : exp3.interpreter())) {
			return "SRW";
		} else if ("Gunner".equals(exp1.interpreter()) && "晓击霸MKII-R".equals(exp2.interpreter())) {
			return "MKII-Gunner";
		} else {
			return "非法的合体操作!";
		}
	}

}

测试

public class Test {

	public static void main(String[] args) {
		// 终结符
		Expression ancientIronExpression = new RobotTerminalExpression("古铁");
		Expression r1Expression = new RobotTerminalExpression("R1");
		Expression r2Expression = new RobotTerminalExpression("R2");
		Expression r3Expression = new RobotTerminalExpression("R3");
		Expression gunnerExpression = new RobotTerminalExpression("Gunner");
		Expression mkiiExpression = new RobotTerminalExpression("晓击霸MKII-R");
		Expression wildExpression = new RobotTerminalExpression("野生兽");
		
		// 测试变形
		TransformNonTerminalExpression transformExpression = new TransformNonTerminalExpression(ancientIronExpression);
		System.out.println("古铁 变形->" + transformExpression.interpreter());
		transformExpression.setExp(r1Expression);
		System.out.println("R1 变形->" +transformExpression.interpreter());
		transformExpression.setExp(wildExpression);
		System.out.println("野生兽 变形->" +transformExpression.interpreter());
		
		System.out.println("-----------------");
		// 测试合体
		CombineNonTerminalExpression combineExpression = new CombineNonTerminalExpression(gunnerExpression, mkiiExpression);
		System.out.println("Gunner 合体  晓击霸MKII-R->" + combineExpression.interpreter());
		combineExpression = new CombineNonTerminalExpression(r1Expression, r2Expression, r3Expression);
		System.out.println("R1 合体  R2 合体 R3->" + combineExpression.interpreter());
		combineExpression = new CombineNonTerminalExpression(r1Expression, r2Expression);
		System.out.println("R1 合体  R2->" + combineExpression.interpreter());
	}
	
}

测试结果

古铁 变形->非法的变形操作!
R1 变形->R-Wing
野生兽 变形->野生兽(FM)
-----------------
Gunner 合体  晓击霸MKII-R->MKII-Gunner
R1 合体  R2 合体 R3->SRW
R1 合体  R2->非法的合体操作!
总结

22个设计模式的最后一个–解释器模式,也是比较难理解的一个,为了不使用运算符这个例子,我想到了机体的变形和合体操作,近似把它看成运算符,例子可能不是那么合适。

22篇文章实际上是一个月的时间内断断续续赶出来的,也没去深究各个模式的具体应用场景和优缺点,所以这些文章会不断的修改和完善,错误之处难免,希望看官持批判的态度看待这些文章。

如果你没有玩过这款游戏,有些情节可能不会有共鸣之处。
这是一款你没有玩过的创新版本,只需体验三分钟,你就会和我一样爱上这款游戏 – by zzh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值