解释器模式
static void Main(string []args) {
PlayContext context = new PlayContext();
Console.WriteLine("上海摊");
context.PlayText = "";
Expression expression = null;
try {
while(context.PlayText.Length > 0){
string str = context.PlayText.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.Interpret(context);
}
}catch(Exception ex) {
Console.WriteLine(ex.Message);
}
}
这里有个小问题,增加一个文法时,除了扩展一个类之外,还改动了客户端,可以在客户端switch那里应用简单工厂加反射。
这里反射还是不太懂,后续在想想看
public class ExpressionFactory {
public static Expression getExpression(string str) {
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;
}
}
}
抽象类表达式类
abstract class Expression {
public void Interpret(PlayContext context) {
//处理context 执行Excute方法
}
// 不同的文法子类,有不同的执行处理
public abstract void Excute(string key,double value);
}