概述
解释器模式是类的行为模式。给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。
核心
概念: 定义一个语言的文法,并且建立一个解释器来解释该语言中的句子,这里的“语言”是指使用规定格式和语法的代码。解释器模式是一种类行为型模式。
解释器模式结构重要核心模块:
抽象表达式(Expression)
声明一个所有的具体表达式角色都需要实现的抽象类。这个类主要有一个Explain()方法,称做解释操作。
实现抽象类
根据场景的需求,实现相应的代码.
使用场景
有一个简单的语法规则,比如编码转换.
一些重复发生的问题.
程序猿实例
说明:
将字符变为指定的编.
abcdefghi jklmn ……-->对应
123456789 abcde 0000
public abstract class InterperterBase
{//抽象类
public abstract string Explain(string str);
}
public class InterperterAtoI : InterperterBase
{//第一种编码转换的实现
public override string Explain(string str)
{
string temp = "";
if (str == "")
{
return temp;
}
List<string> numlist = new List<string>();
foreach ( char item in str.ToLower ().ToArray ())
{
switch (item)
{
case 'a':
numlist.Add("1");
break;
case 'b':
numlist.Add("2");
break;
case 'c':
numlist.Add("3");
break;
case 'd':
numlist.Add("4");
break;
case 'e':
numlist.Add("5");
break;
case 'f':
numlist.Add("6");
break;
case 'g':
numlist.Add("7");
break;
case 'h':
numlist.Add("8");
break;
case 'i':
numlist.Add("9");
break;
default:
numlist.Add(item.ToString());
break;
}
}
numlist.ForEach(a => temp += a);
return temp;
}
}
public class InterperterJtoN : InterperterBase
{//第二种方法的实现
public override string Explain(string str)
{
string temp = "";
if (str == "")
{
return temp;
}
List<string> numlist = new List<string>();
foreach (char item in str.ToLower().ToArray())
{
switch (item)
{
case 'j':
numlist.Add("a");
break;
case 'k':
numlist.Add("b");
break;
case 'l':
numlist.Add("c");
break;
case 'm':
numlist.Add("d");
break;
case 'n':
numlist.Add("e");
break;
default:
numlist.Add(item.ToString());
break;
}
}
numlist.ForEach(a => temp += a);
return temp;
}
}
public class InterperterEng : InterperterBase
{//N种方法的实现
public override string Explain(string str)
{
string temp = "";
if (str == "")
{
return temp;
}
List<char > convertToNumber = new List<char>() { '1', '2', '3', '4', '5', '6','7', '8', '9'};
List<string> numlist = new List<string>();
str.ToLower().ToArray().ToList().ForEach(o =>
{
if (convertToNumber.Contains(o))
{
numlist.Add(o.ToString());
}
else
{
numlist.Add("0");
}
});
numlist.ForEach(a => temp += a);
return temp;
}
}
调用
string cc = "AZJway";
List<InterperterBase> convert = new List<InterperterBase>();
convert.Add(new InterperterJtoN());
convert.Add(new InterperterAtoI());
convert.Add(new InterperterEng());
//string temp = "";
convert.ForEach((o) => { cc = o.Explain(cc); });