Net设计模式实例之解释器模式(Interpreter Pattern)
一、解釋器模式簡(jiǎn)介(Brief Introduction)
解釋器模式(Interpreter Pattern),給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。使用了解釋器模式,可以很容易地改變和擴(kuò)展文法,因?yàn)樵撃J绞褂妙?lèi)來(lái)表示文法規(guī)則,可以使用繼承來(lái)改變或擴(kuò)展該文法。也比較容易實(shí)現(xiàn)文法,因?yàn)槎x抽象語(yǔ)法樹(shù)中各個(gè)節(jié)點(diǎn)的類(lèi)的實(shí)現(xiàn)大體類(lèi)似,這些類(lèi)容易直接編寫(xiě)。
二、解決的問(wèn)題(What To Solve)
如果一種特定類(lèi)型的問(wèn)題發(fā)生的頻率足夠高,那么可能就值得將該問(wèn)題的各個(gè)實(shí)例表述為一個(gè)簡(jiǎn)單語(yǔ)言中的句子,這樣就可以構(gòu)建一個(gè)解釋器,該解釋器通過(guò)解釋這些句子來(lái)解決問(wèn)題。
三、解釋器模式分析(Analysis)
1、解釋器模式結(jié)構(gòu)
AbstractExpression抽象類(lèi):聲明一個(gè)接口,用于執(zhí)行一個(gè)操作。
TerminalExpression類(lèi):終結(jié)符表達(dá)式,實(shí)現(xiàn)與文法中的終結(jié)符相關(guān)的解釋操作。
NonterminalExpression類(lèi):非終結(jié)符表達(dá)式,為文法中的非終結(jié)符實(shí)現(xiàn)解釋操作。對(duì)文法中每一條規(guī)則R1、R2.......RN都需要一個(gè)具體的非終結(jié)符表達(dá)式類(lèi)。
Context類(lèi):包含解釋器之外的一些全局信息。
2、源代碼
| 1、抽象表達(dá)式AbstractExpression |
| public abstract class AbstractExpression { ??? public abstract void Interpret(Context context); } |
?
| 2、終結(jié)符表達(dá)式TerminalExpression |
| public class TerminalExpression:AbstractExpression { ??? public override void Interpret(Context context) ??? { ??????? Console.WriteLine("調(diào)用終止符表達(dá)式Terminal.Interpret()"); ??? } } |
?
| 3、非終結(jié)符表達(dá)式NonterminalExpression |
| public class NonterminalExpression:AbstractExpression { ??? public override void Interpret(Context context) ??? { ??????? Console.WriteLine("調(diào)用非終止符表達(dá)式 Nonterminal.Interpret()"); ??? } } |
?
| 4、上下文類(lèi)Context |
| public class Context { } |
?
| 5、客戶(hù)端代碼 |
| static void Main(string[] args) { ??? Context context = new Context(); ??? ArrayList list = new ArrayList(); ? ??? //填充語(yǔ)法樹(shù) ??? list.Add(new TerminalExpression()); ??? list.Add(new NonterminalExpression()); ??? list.Add(new TerminalExpression()); ??? list.Add(new TerminalExpression()); ? ??? //解析 ??? foreach (AbstractExpression abstractExpression in list) ??? { ??? ????abstractExpression.Interpret(context); ??? } ??? Console.ReadKey(); } |
3、程序運(yùn)行結(jié)果
四.解釋器模式案例分析(Example)
1、場(chǎng)景
?? 羅馬字符轉(zhuǎn)換為十進(jìn)制數(shù)字,如下圖所示
Expression抽象類(lèi):抽象表達(dá)式,聲明一個(gè)抽象的解釋器操作,這個(gè)抽象類(lèi)為抽象語(yǔ)法樹(shù)中所有的節(jié)點(diǎn)所共享。
ThousandExpression類(lèi):用來(lái)核對(duì)羅馬字符中的 M ;
HundredExpression類(lèi):用來(lái)核對(duì)羅馬字符中的C, CD, D or CM;
TenExpression類(lèi):用來(lái)核對(duì)羅馬字附中的X, XL, L and XC;
OneExpression類(lèi):用來(lái)核對(duì)羅馬字附中的I, II, III, IV, V, VI, VI, VII, VIII, IX。
2、代碼
| 1、上下文類(lèi)Context |
| class Context { ??? private string _input; ??? private int _output; ??? public Context(string input) ??? { ???? ???this._input = input; ??? } ??? public string Input ??? { ??????? get { return _input; } ??????? set { _input = value; } ??? } ??? public int Output ??? { ??????? get { return _output; } ??????? set { _output = value; } ??? } } |
?
| 2、抽象表達(dá)式類(lèi)Expression |
| abstract class Expression { ??? public void Interpret(Context context) ??? { ??????? if (context.Input.Length == 0) ??????????? return; ??????? if (context.Input.StartsWith(Nine())) ??????? { ??????????? context.Output += (9 * Multiplier()); ??????????? context.Input = context.Input.Substring(2); ??????? } ??????? else if (context.Input.StartsWith(Four())) ??????? { ??????????? context.Output += (4 * Multiplier()); ??????????? context.Input = context.Input.Substring(2); ??????? } ??????? else if (context.Input.StartsWith(Five())) ??????? { ??????????? context.Output += (5 * Multiplier()); ??????????? context.Input = context.Input.Substring(1); ??????? } ??????? while (context.Input.StartsWith(One())) ??????? { ??????????? context.Output += (1 * Multiplier()); ??????????? context.Input = context.Input.Substring(1); ??????? } ??? } ??? public abstract string One(); ??? public abstract string Four(); ??? public abstract string Five(); ??? public abstract string Nine(); ??? public abstract int Multiplier(); } |
?
| 3、終止符表達(dá)式類(lèi)ThousandExpression、HundredExpression、TenExpression等 |
| /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用來(lái)核對(duì)羅馬字符中的 M /// </remarks> /// </summary> class ThousandExpression : Expression { ??? public override string One() { return "M"; } ??? public override string Four() { return " "; } ??? public override string Five() { return " "; } ??? public override string Nine() { return " "; } ??? public override int Multiplier() { return 1000; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用來(lái)核對(duì)羅馬字符中的C, CD, D or CM; /// </remarks> /// </summary> class HundredExpression : Expression { ??? public override string One() { return "C"; } ??? public override string Four() { return "CD"; } ??? public override string Five() { return "D"; } ??? public override string Nine() { return "CM"; } ??? public override int Multiplier() { return 100; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用來(lái)核對(duì)羅馬字附中的X, XL, L and XC /// </remarks> /// </summary> class TenExpression : Expression { ??? public override string One() { return "X"; } ??? public override string Four() { return "XL"; } ??? public override string Five() { return "L"; } ??? public override string Nine() { return "XC"; } ??? public override int Multiplier() { return 10; } } /// <summary> /// A 'TerminalExpression' class /// <remarks> /// 用來(lái)核對(duì)羅馬字附中的I, II, III, IV, V, VI, VI, VII, VIII, IX /// </remarks> /// </summary> class OneExpression : Expression { ??? public override string One() { return "I"; } ???public override string Four() { return "IV"; } ??? public override string Five() { return "V"; } ??? public override string Nine() { return "IX"; } ??? public override int Multiplier() { return 1; } } |
?
?
| 4、客戶(hù)端代碼 |
| static void Main(string[] args) { ??? string roman = "MCMXXVIII"; ??? Context context = new Context(roman); ??? // Build the 'parse tree' ??? List<Expression> tree = new List<Expression>(); ??? tree.Add(new ThousandExpression()); ??? tree.Add(new HundredExpression()); ??? tree.Add(new TenExpression()); ??? tree.Add(new OneExpression()); ? ??? // Interpret ??? foreach (Expression exp in tree) ??? { ??????? exp.Interpret(context); ??? } ??? Console.WriteLine("{0} = {1}",roman, context.Output); ??? Console.ReadKey(); } |
3、運(yùn)行結(jié)果
五、總結(jié)(Summary)
解釋器模式(Interpreter Pattern),給定一個(gè)語(yǔ)言,定義它的文法的一種表示,并定義一個(gè)解釋器,這個(gè)解釋器使用該表示來(lái)解釋語(yǔ)言中的句子。當(dāng)有一個(gè)語(yǔ)言需要解釋執(zhí)行,并且你可將該語(yǔ)言中的句子表示為一個(gè)抽象的語(yǔ)法樹(shù)時(shí),可以考慮使用解釋器模式。
轉(zhuǎn)載于:https://www.cnblogs.com/zhuawang/archive/2011/09/26/2192379.html
總結(jié)
以上是生活随笔為你收集整理的Net设计模式实例之解释器模式(Interpreter Pattern)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .NET中的加密算法总结(自定义加密He
- 下一篇: ASP导出EXCEL乱码?试试这个