日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Net设计模式实例之解释器模式(Interpreter Pattern)

發(fā)布時間:2025/7/14 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Net设计模式实例之解释器模式(Interpreter Pattern) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、解釋器模式簡介(Brief Introduction

解釋器模式(Interpreter Pattern),給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。使用了解釋器模式,可以很容易地改變和擴展文法,因為該模式使用類來表示文法規(guī)則,可以使用繼承來改變或擴展該文法。也比較容易實現(xiàn)文法,因為定義抽象語法樹中各個節(jié)點的類的實現(xiàn)大體類似,這些類容易直接編寫。

二、解決的問題(What To Solve

如果一種特定類型的問題發(fā)生的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子,這樣就可以構(gòu)建一個解釋器,該解釋器通過解釋這些句子來解決問題。

三、解釋器模式分析(Analysis

1、解釋器模式結(jié)構(gòu)

AbstractExpression抽象類:聲明一個接口,用于執(zhí)行一個操作。

TerminalExpression:終結(jié)符表達式,實現(xiàn)與文法中的終結(jié)符相關(guān)的解釋操作。

NonterminalExpression:非終結(jié)符表達式,為文法中的非終結(jié)符實現(xiàn)解釋操作。對文法中每一條規(guī)則R1R2.......RN都需要一個具體的非終結(jié)符表達式類。

Context:包含解釋器之外的一些全局信息。

2、源代碼

1、抽象表達式AbstractExpression

public abstract class AbstractExpression

{

??? public abstract void Interpret(Context context);

}

?

2、終結(jié)符表達式TerminalExpression

public class TerminalExpression:AbstractExpression

{

??? public override void Interpret(Context context)

??? {

??????? Console.WriteLine("調(diào)用終止符表達式Terminal.Interpret()");

??? }

}

?

3、非終結(jié)符表達式NonterminalExpression

public class NonterminalExpression:AbstractExpression

{

??? public override void Interpret(Context context)

??? {

??????? Console.WriteLine("調(diào)用非終止符表達式 Nonterminal.Interpret()");

??? }

}

?

4、上下文類Context

public class Context

{

}

?

5、客戶端代碼

static void Main(string[] args)

{

??? Context context = new Context();

??? ArrayList list = new ArrayList();

?

??? //填充語法樹

??? 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、程序運行結(jié)果

四.解釋器模式案例分析(Example

1、場景

?? 羅馬字符轉(zhuǎn)換為十進制數(shù)字,如下圖所示

Expression抽象類:抽象表達式,聲明一個抽象的解釋器操作,這個抽象類為抽象語法樹中所有的節(jié)點所共享。

ThousandExpression:用來核對羅馬字符中的 M

HundredExpression:用來核對羅馬字符中的C, CD, D or CM

TenExpression:用來核對羅馬字附中的X, XL, L and XC

OneExpression:用來核對羅馬字附中的I, II, III, IV, V, VI, VI, VII, VIII, IX

2、代碼

1、上下文類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、抽象表達式類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、終止符表達式類ThousandExpressionHundredExpressionTenExpression

/// <summary>

/// A 'TerminalExpression' class

/// <remarks>

/// 用來核對羅馬字符中的 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>

/// 用來核對羅馬字符中的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>

/// 用來核對羅馬字附中的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>

/// 用來核對羅馬字附中的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、客戶端代碼

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、運行結(jié)果

五、總結(jié)(Summary

解釋器模式(Interpreter Pattern),給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。當(dāng)有一個語言需要解釋執(zhí)行,并且你可將該語言中的句子表示為一個抽象的語法樹時,可以考慮使用解釋器模式。

轉(zhuǎn)載于:https://www.cnblogs.com/zhuawang/archive/2011/09/26/2192379.html

總結(jié)

以上是生活随笔為你收集整理的Net设计模式实例之解释器模式(Interpreter Pattern)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。