原文 第19章 解释器模式(Interpreter Pattern)
解释器模式
导读:解释器模式,平常用的比较的少,所以在写这个模式之前在博客园搜索了一番,看完之后那叫一个头大。篇幅很长,我鼓足了劲看了半天的描述跟解释,可能是本人的水平有限,或者是耐心太差,看到一半就有点扛不住了。我感觉对于一个菜鸟或者是没接触过设计模式的人来说,在看设计模式的时候更希望作者能简短的用几行代码来描述设计模式,这样起码看完大体有个概念。
概述:
Interpreter模式也叫解释器模式,是由GoF提出的23种设计模式中的一种。Interpreter是行为模式之一,它是一种特殊的设计模式,它建立一个解释器,对于特定的计算机程序设计语言,用来解释预先定义的文法。
结构图:
代码举例(我已经最简单化了,一看即懂)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
/// <summary>
/// 解释器上下文环境类。用来存储解释器的上下文环境,比如需要解释的文法等。
/// </summary>
class Context
{
private int sum;
public int Sum
{
get { return sum; }
set { sum=value;}
}
}
/// <summary>
/// 解释器抽象类。
/// </summary>
abstract class AbstractExpreesion
{
public abstract void Interpret(Context context);
}
/// <summary>
/// 解释器具体实现类。自加
/// </summary>
class PlusExpression : AbstractExpreesion
{
public override void Interpret(Context context)
{
int sum = context.Sum;
sum++;
context.Sum = sum;
}
}
/// <summary>
/// 解释器具体实现类。 自减
/// </summary>
class MinusExpression : AbstractExpreesion
{
public override void Interpret(Context context)
{
int sum = context.Sum;
sum--;
context.Sum = sum;
}
}
|
客户端调用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class Program
{
static void Main( string [] args)
{
Context context = new Context();
context.Sum = 10;
List<AbstractExpreesion> list = new List<AbstractExpreesion>();
//运行加法三次
list.Add( new PlusExpression());
list.Add( new PlusExpression());
list.Add( new PlusExpression());
//运行减法两次
list.Add( new MinusExpression());
list.Add( new MinusExpression());
for ( int i = 0; i < list.Count(); i++)
{
AbstractExpreesion expression = list[i];
expression.Interpret(context);
}
Console.WriteLine(context.Sum);
Console.ReadLine();
//得出结果为11
}
}
|
看完之后,是不是觉得很简单,无非是设定几个公式,然后统一进行执行。最终得到结果!设计模式代表的是一种思想,至于怎么千变万化就看大家的了
适用场景:
1.当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树,可以使用解释器模式。而当存在以下情况时该模式效果最好
2.该文法的类层次结构变得庞大而无法管理。此时语法分析程序生成器这样的工具是最好的选择。他们无需构建抽象语法树即可解释表达式,这样可以节省空间而且还可能节省时间。
3.效率不是一个关键问题,最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将他们装换成另一种形式,例如,正则表达式通常被装换成状态机,即使在这种情况下,转换器仍可用解释器模式实现,该模式仍是有用的