日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

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

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

一、解釋器模式簡(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ī)則R1R2.......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)ThousandExpressionHundredExpressionTenExpression

/// <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)題。

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