模式設計c#--行為型--interpreter
| 名稱 | Interpreter |
| 結構 |
|
| 意圖 | 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。 |
| 適用性 |
|
Code Example
namespace?Interpreter_DesignPattern

{
????using?System;
????using?System.Collections;
????class?Context?
????
{
????????
????}
????abstract?class?AbstractExpression?
????
{
????????abstract?public?void?Interpret(Context?c);
????}
????//?class?for?terminal?symbol
????class?TerminalExpression?:?AbstractExpression
????
{
????????override?public?void?Interpret(Context?c)????
????????
{
????????????
????????}
????}
????//?class?for?grammar?rule?(one?per?rule?needed)
????class?NonterminalExpression?:?AbstractExpression
????
{
????????override?public?void?Interpret(Context?c)????
????????
{
????????????
????????}????
????}
????//?to?extend?grammar,?just?add?other?NonterminalExpression?classes

????/**////?<summary>
????///????Summary?description?for?Client.
????///?</summary>
????public?class?Client
????
{
????????public?static?int?Main(string[]?args)
????????
{
????????????Context?c?=?new?Context();
????????????ArrayList?l?=?new?ArrayList();?//really?need?a?tree?here!
????????????//?build?up?context?information?
????????????//?.?.?.
????????????//?Populate?abstract?syntax?tree?with?data
????????????l.Add(new?TerminalExpression());
????????????l.Add(new?NonterminalExpression());
????????????//?interpret
????????????foreach?(AbstractExpression?exp?in?l)
????????????
{
????????????????exp.Interpret(c);
????????????}
????????????????????
????????????return?0;
????????}
????}
}
解析表達式:
//?Interpreter?pattern?--?Real?World?example??

using?System;
using?System.Collections;
namespace?DoFactory.GangOfFour.Interpreter.RealWorld

{
??//?MainApp?test?application?
??class?MainApp
??
{
????static?void?Main()
????
{
??????string?roman?=?"MCMXXVIII";
??????Context?context?=?new?Context(roman);
??????//?Build?the?'parse?tree'?
??????ArrayList?tree?=?new?ArrayList();
??????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);
??????//?Wait?for?user?
??????Console.Read();
????}
??}
??//?"Context"?
??class?Context
??
{
????private?string?input;
????private?int?output;
????//?Constructor?
????public?Context(string?input)
????
{
??????this.input?=?input;
????}
????//?Properties?
????public?string?Input
????
{
??????get
{?return?input;?}
??????set
{?input?=?value;?}
????}
????public?int?Output
????
{
??????get
{?return?output;?}
??????set
{?output?=?value;?}
????}
??}
??//?"AbstractExpression"?
??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();
??}
??//?Thousand?checks?for?the?Roman?Numeral?M?
??//?"TerminalExpression"?
??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;?}
??}
??//?Hundred?checks?C,?CD,?D?or?CM?
??//?"TerminalExpression"?
??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;?}
??}
??//?Ten?checks?for?X,?XL,?L?and?XC?
??//?"TerminalExpression"?
??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;?}
??}
??//?One?checks?for?I,?II,?III,?IV,?V,?VI,?VI,?VII,?VIII,?IX?
??//?"TerminalExpression"?
??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;?}
??}
}
?
MCMXXVIII = 1928 |
posted on 2006-01-03 16:02 夢在天涯 閱讀(924) 評論(0) 編輯 收藏 引用 所屬分類: Design pattern

