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);
}
}
资料来源:程杰老师<大话设计模式>