解释器模式

1、解释器模式:给定一个语言,定义文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

实现代码如下:

1、Context类

public class Context
{
private String input;
private String output;
public String getOutput()
{
	return output;
}

public void setOutput(String output)
{
	this.output = output;
}

public String getInput()
{
	return input;
}

public void setInput(String input)
{
	this.input = input;
}
}
2、AbstractExpression类

public abstract class AbstractExpression
{
public abstract void Interpreter(Context context);
}
3、具体Expressionl类

public class NonterminalExpression extends AbstractExpression
{

	@Override
	public void Interpreter(Context context)
	{
		// TODO Auto-generated method stub
		System.out.println("非终端解释器");
	}
}

<pre name="code" class="java">class TerminalExperssion extends AbstractExpression
{

	@Override
	public void Interpreter(Context context)
	{
		// TODO Auto-generated method stub
		System.out.println("终端解释器");
		
	}
}

 4、客户端类 

public class Client
{
public static void main(String[] args)
{
	Context context=new Context();
	List<AbstractExpression> list=new ArrayList<AbstractExpression>();
	list.add(new TerminalExperssion());
	list.add(new NonterminalExpression());
	list.add(new TerminalExperssion());
	list.add(new TerminalExperssion());
	for(AbstractExpression exp:list)
	{
		exp.Interpreter(context);
	}
}
}

实例:将一段乐谱翻译成数字。翻译规则如下:

o表示音阶
o1表示低音
o2表示中音
o3表示高音
p表示休止符
CDEFGAB表示do-re-mi-fa-so-la-ti
音符长度1表示一拍
音符长度2表示二拍
音符长度0.5表示半拍
音符长度0.25表示四分之一拍

代码如下:

1、PlayContext类

public class PlayContext
{
    private String text;

	public String getText()
	{
		return text;
	}

	public void setText(String text)
	{
		this.text = text;
	}
}
2、音符类

public class Note extends Expression
{

	@Override
	public void execute(String key, double value)
	{
		// TODO Auto-generated method stub
		String note="";
		switch(key)
		{
		case "C":
			note="1";
			break;
		case "D":
			note="2";
			break;
		case "E":
			note="3";
			break;
		case "F":
			note="4";
			break;
		case "G":
			note="5";
			break;
		case "A":
			note="6";
			break;
		case "B":
			note="7";
			break;
		}
		System.out.print(note+" ");
	}

}

3、音阶类

public class Scale extends Expression
{

	@Override
	public void execute(String key, double value)
	{
		// TODO Auto-generated method stub
		String scale=" ";
		switch((int)value)
		{
		case 1:
			scale="低音";
			break;
		case 2:
			scale="中音";
			break;
		case 3:
			scale="高音";
			break;
		}
		System.out.println(scale+" ");
	}

}
4、Expression类

public abstract class Expression
{
public void interpreter(PlayContext context)
{
	if(context.getText().length()==0 || context.getText().equals(" "))
	{
		return;
	}
	else
	{
		String playKey=context.getText().substring(0,1);
		context.setText(context.getText().substring(2));
		double playValue=Double.valueOf(context.getText().substring(0,context.getText().indexOf(" ")));
		context.setText(context.getText().substring(context.getText().indexOf(" ")+1));
		execute(playKey,playValue);
		
		
	}
}
public abstract void execute(String key,double value);
}

5、用简单工厂方法做相应的实例

public interface IFactory
{
	public void createExpression(PlayContext context);
}

6、具体工厂类

public class CreateExpressionFactory implements IFactory
{
	public void createExpression(PlayContext context)
	{
		Expression expression = null;
		while (context.getText().length() > 0)
		{
			String str = context.getText().substring(0, 1);
			switch (str)
			{
			case "O":
				expression = new Scale();
				break;
			case "C":
			case "D":
			case "E":
			case "F":
			case "G":
			case "A":
			case "B":
			case "P":
				expression = new Note();
				break;
			}
			expression.interpreter(context);
		}
	}
}

7、客户端类

public class Client
{
public static void main(String[] args)
{
	PlayContext context=new PlayContext();
	System.out.println("音乐:");
	context.setText("O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 ");
	IFactory factory=new CreateExpressionFactory();
	factory.createExpression(context);
	}
}
资料来源:程杰老师<大话设计模式>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值