欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

设计模式漫谈之解释器模式

程序员文章站 2022-03-26 15:00:54
今天5月1号了,回郑州,在家待了三天。打了几天手游,花了不少钱。家里准备再盖座房子,我也应该为家里做些贡献。真他娘累,30多了,单身,现在已有些恐婚了。近期有空要做个记账软件,否则钱花的太快了。这个月,20多号还要软考,我这应该是考不过了,基本放弃了。老板原说涨3K,又变成2K,坑,套路。 近期我写 ......

今天5月1号了,回郑州,在家待了三天。打了几天手游,花了不少钱。家里准备再盖座房子,我也应该为家里做些贡献。真他娘累,30多了,单身,现在已有些恐婚了。近期有空要做个记账软件,否则钱花的太快了。这个月,20多号还要软考,我这应该是考不过了,基本放弃了。老板原说涨3K,又变成2K,坑,套路。

近期我写的代码有上层到github和csdn code中,这种托管代码平台绝对是程序员的福利。

闲话少扯,继续说设计模式,从今天起就开始说行为模式。刚看到C#版本都更新到8.0了,让我意识到,编程思想很重要,否则做程序员绝对累。思想上的东西就是内功,内功屌打出来的普通招式也牛13.

写代码的时候不要刻意用设计模式,用编程思想是根本。像面向对象的语言C#,设计的时候可以从两个方面入手,抽象方面=》具体;核心代码=》封装。原则就是易扩展,易维护,高内聚低耦合。

类型从数量上分,可以是两种,表示单个数的类型,表示多个数的类型。

抽象的,接口,所有不具体的,只能做引用,不能创造对象。在面向对象中所有对象必须有宿主。

编程界四大神器,编译器,解释器,链接器,调试器。把一种表现形式解释成另一种表现形式。

说起来绕,直接上代码。我来解释说明。

//包装属性的宿主类

class PlayContext
{

private string text;
public string PlayText
{
get { return text; }
set { text = value; }
}
}

//抽象概念上就是对内容进行解释。

abstract class Expression
{

public void Interpret(PlayContext context)
{
if (context.PlayText.Length == 0)
{
return;
}
else
{
string playKey = context.PlayText.Substring(0, 1);
context.PlayText = context.PlayText.Substring(2);
double playValue = Convert.ToDouble(context.PlayText.Substring(0, context.PlayText.IndexOf(" ")));
context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);

Excute(playKey, playValue);

}
}
//不同的具体解释内容
public abstract void Excute(string key, double value);
}

//具体的解释内容

class Note : Expression
{
public override void Excute(string key, double value)
{
string note = "";
switch (key)
{
case "C":
note = "1";
break;
case "D":
note = "2";
break;
case "E":
note = "3";
break;
case "F":
note = "4";
break;
case "G":
note = "5";
break;
case "A":
note = "6";
break;
case "B":
note = "7";
break;

}
Console.Write("{0} ", note);
}
}

//不同的解释内容

class Scale : Expression
{
public override void Excute(string key, double value)
{
string scale = "";
switch (Convert.ToInt32(value))
{
case 1:
scale = "低音";
break;
case 2:
scale = "中音";
break;
case 3:
scale = "高音";
break;

}
Console.Write("{0} ", scale);
}
}

//对不同的情况进行解释

PlayContext context = new PlayContext();

Console.WriteLine("上海滩:");
//context.演奏文本 = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 O 2 C 0.5 O 1 G 3 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 P 0.5 O 3 C 0.5 C 0.5 O 2 A 0.5 O 3 C 2 P 0.5 O 2 A 0.5 O 3 C 0.5 O 2 A 0.5 G 2.5 G 0.5 E 0.5 A 1.5 G 0.5 C 1 D 0.25 C 0.25 D 0.5 E 2.5 E 0.5 E 0.5 D 0.5 E 2.5 O 3 C 0.5 C 0.5 O 2 B 0.5 A 3 E 0.5 E 0.5 D 1.5 E 0.5 O 3 C 0.5 O 2 B 0.5 A 0.5 E 0.5 G 2 P 0.5 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 D 0.5 E 0.5 G 3 D 0.5 E 0.5 O 1 A 3 A 0.5 O 2 C 0.5 D 1.5 E 0.5 D 0.5 O 1 B 0.5 A 0.5 G 0.5 O 2 C 3 ";
context.PlayText = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";

//Console.WriteLine("隐形的翅膀:");
//context.演奏文本 = "T 1000 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 O 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 E 1 D 0.5 C 0.5 C 0.5 C 0.5 C 0.5 O 1 A 0.25 G 0.25 G 1 G 0.5 O 2 C 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 1 A 0.5 G 0.5 E 1.5 G 0.5 G 0.5 G 0.5 A 0.5 G 0.5 E 0.5 D 0.5 C 0.5 C 0.25 D 0.25 O 1 A 1 G 0.5 A 0.5 O 2 C 1.5 D 0.25 E 0.25 D 1 E 0.5 C 0.5 C 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.25 D 0.25 D 3 E 0.5 G 0.5 O 3 C 1.5 O 2 B 0.25 O 3 C 0.25 O 2 B 1 A 0.5 G 0.5 A 0.5 O 3 C 0.5 O 2 E 0.5 D 0.5 C 1 C 0.5 C 0.5 C 0.5 O 3 C 1 O 2 G 0.25 A 0.25 G 0.5 D 0.25 E 0.25 D 0.5 C 0.5 C 3 ";
Expression expression = null;
try
{
while (context.PlayText.Length > 0)
{
string str = context.PlayText.Substring(0, 1);
switch (str)
{
case "O":
expression = new Scale();
break;
case "T":
expression = new Speed();
break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":
case "P":
expression = new Note();
break;

}

//分不同情况操作同一个实例
expression.Interpret(context);

}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

Console.Read();

 

总结:解释模式就是对一种表现形式的另一种解释。使用设计模式的目的就是为了易扩展易维护,也正是因为面向对象中有抽象与具体分开的继承,实现的机制。

程序员最宝贵的是编程思想,不扯了,现在心有点不静,到此为止吧,大家多多包涵。