- 給定一個語言,定義它的文法的一種表示,並定義一個解釋器,解釋器使用該表示來解釋語言中的句子。
- 當有一個語言需要解譯執行,並且你可將該語言中的句子表示為一個抽象語法樹時,可使用解譯器模式。
 |
基本架構圖 |
 |
實例架構圖 |
using System;
using System.Configuration;
using System.Reflection;
namespace DPExample
{
// 演奏內容
public class PlayContext
{
private string text;
public string 演奏文字
{
get { return text; }
set { text = value; }
}
}
// 運算式
abstract class Expression
{
public void 解譯器(PlayContext context)
{
if (context.演奏文字.Length == 0)
return;
else
{
string playKey = context.演奏文字.Substring(0, 1);
context.演奏文字 = context.演奏文字.Substring(2);
double playValue = Convert.ToDouble(context.演奏文字.Substring(0, context.演奏文字.IndexOf(" ")));
context.演奏文字 = context.演奏文字.Substring(context.演奏文字.IndexOf(" ") + 1);
執行(playKey, playValue);
}
}
public abstract void 執行(string key, double value);
}
// 音符
class Note : Expression
{
public override void 執行(string key, double value)
{
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;
}
Console.Write ("{0} ", note);
}
}
// 音階
class Scale : Expression
{
public override void 執行(string key, double value)
{
string scale = "";
switch (Convert.ToInt32(value))
{
case 1:
scale = "低音";
break;
case 2:
scale = "中音";
break;
case 3:
scale = "高音";
break;
}
Console.Write ("{0} ", scale);
}
}
// 音速
class Speed : Expression
{
public override void 執行(string key, double value)
{
string speed;
if (value < 500)
speed = "快速";
else if (value >= 1000)
speed = "慢速";
else
speed = "中速";
Console.Write ("{0} ", speed);
}
}
// 運算式工廠
class ExpressionFactory
{
private static readonly string MusicAssemblyName = "DPExample";
private static string concreteExpression;
public static Expression createExpression (string str)
{
concreteExpression = ConfigurationManager.AppSettings["MUSIC_" + str];
string className = MusicAssemblyName + "." + concreteExpression;
return (Expression)Assembly.Load(MusicAssemblyName).CreateInstance(className);
}
}
}
一般版本
using System;
namespace DPExample
{
public class Program
{
static void Main()
{
PlayContext context = new PlayContext();
Console.WriteLine("上海灘:");
context.演奏文字 = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";
Expression expression = null;
try
{
while (context.演奏文字.Length > 0)
{
string str = context.演奏文字.Substring(0, 1);
switch (str)
{
case "O":
expression = new Scale();
break;
case "T":
expression = new Speed();
break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":
case "P":
expression = new Note();
break;
}
expression.解譯器(context);
}
} catch (Exception ex)
{
Console.WriteLine (ex.Message);
}
}
}
}
透過簡單工廠+反射修正
using System;
namespace DPExample
{
public class Program
{
static void Main()
{
PlayContext context = new PlayContext();
Console.WriteLine("上海灘:");
context.演奏文字 = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";
Expression expression = null;
try
{
while (context.演奏文字.Length > 0)
{
string str = context.演奏文字.Substring(0, 1);
expression = ExpressionFactory.createExpression(str);
expression.解譯器(context);
}
} catch (Exception ex)
{
Console.WriteLine (ex.Message);
}
}
}
}
留言
張貼留言