🏆 作者简介,愚公搬代码 🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。 🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
设计模式(Design Pattern)是软件开发领域的宝贵经验,是多人反复借鉴和广泛应用的代码设计指导。它们是一系列经过分类和归纳的代码组织方法,旨在实现可重用性、可维护性和可理解性。使用设计模式,我们能够编写高质量的代码,使其更易于他人理解,并提供了代码可靠性的保证。
毫无疑问,设计模式对个人、团队和整个系统都带来了显著的益处。它们将代码开发提升到工程化水平,为软件工程构建提供了坚实的基础,就如同大厦的一块块精巧的砖石一样。在项目中明智地应用设计模式可以完美地解决各种复杂问题。每种设计模式都有相应的原理和最佳实践,它们描述了我们日常开发中不断遇到的问题,以及这些问题的核心解决方法。正是因为这种实用性和通用性,设计模式才能在软件开发中广泛地得以应用。设计模式是构建稳健、可扩展和可维护软件的关键工具,为开发者们提供了解决问题的智慧和指导。
解释器模式属于行为型设计模式,它用于定义一种语言的文法表示,并提供了一种解释器来解释这种语言中的句子。
解释器模式的核心思想是将语言的文法规则表示成对象,并且提供了一种解释器来解释这些对象。这样,我们可以通过构建不同的文法对象和组合它们来表示复杂的语法结构,并且可以用解释器来执行这些语法结构。
主要要点:
解释器模式提供了一种灵活的方式来处理语法解释和执行,使得我们可以轻松地扩展和修改支持的语法规则。它在那些需要构建自定义语言或处理复杂语法的应用中非常有价值。
在解释器模式(Interpreter Pattern)中,抽象表达式(Expression)是一个关键概念,它代表了语言中的文法规则的抽象表示,具有以下作用和特点:
抽象表达式在解释器模式中充当了核心角色,它们代表了语言中的文法规则,并提供了解释这些规则的方法。通过组合和递归使用抽象表达式,可以构建出复杂的表达式树,从而实现对语法句子的解释和执行。这使得解释器模式在处理自定义语言、规则引擎和各种领域的语法解析中非常有用。
在解释器模式(Interpreter Pattern)中,终结符表达式(Terminal Expression)是一种抽象表达式(Expression)的特殊类型,具有以下概念和作用:
终结符表达式在解释器模式中代表了语法规则中的最基本的、不可再分的语法单元,它们的主要作用是执行最终的语法解释操作,通常作为表达式树的叶子节点。这有助于将复杂的语法结构分解为更简单的组成部分,以实现对语法句子的完整解释。
在解释器模式(Interpreter Pattern)中,非终结符表达式(Nonterminal Expression)是一种抽象表达式(Expression)的特殊类型,具有以下概念和作用:
非终结符表达式在解释器模式中代表了语言中的复杂语法结构,它们的主要作用是组合和解释子表达式,以实现对整个语法结构的解释。非终结符表达式通常包含递归调用,以处理嵌套的语法规则,使得解释器模式能够处理复杂的语法解释任务。
在解释器模式(Interpreter Pattern)中,环境(Context)是一个重要的概念,它具有以下概念和作用:
环境在解释器模式中充当了存储和提供解释器所需数据的角色,它用于隔离解释器和上下文,同时支持多次解释不同的表达式。通过使用环境,可以使解释器模式更加灵活和可扩展,同时保持解释器的独立性,使其能够适应不同的应用场景。
命名空间InterpreterPattern中包含IWord抽象表达式接口,4个终结符表达式和1个非终结符表达式,Instruction类代表1条完整的指令,Semicolon类分隔左右两边的指令,Interpreter类充当环境类以构建表达式树并调用抽象表达式接口的解释方法Interpret。本案例尝试通过控制一次飞机的起飞至降落的过程来讲述解释器模式的使用方法。以下是我们要解释的指令:
340.00 10.00 taxing 1.00;
27.00 120.00 takeoff 1.00;
90.00 350.00 fly 30.00;
180.00 400.00 cruise 230.00;
50.00 320.00 fly 20.00;
320.00 110.00 landing 3.00;
120.00 10.00 taxing 3.00;
以上是我们要解释的所有7条指令,所有指令在同一行上,分号后是没有换行的,因为文章排版需要加了换行。以第1行为例解释每个参数的含义。340.00代表航向,10.00代表空速,taxing代表飞机的运动类型,1.00代表航程。
public interface IWord {
string Interpret();
}
定义抽象表达式接口IWord,包含一个Interpret方法。
public sealed class Course : IWord {
private double _course = 0;
public Course(double course) {
this._course = course;
}
public string Interpret() {
return $"heading:{_course}°,";
}
}
航向解释类Course,终结符表达式。
public sealed class Speed : IWord {
private double _speed = 0;
public Speed(double speed) {
this._speed = speed;
}
public string Interpret() {
return "speed:" + _speed.ToString() + "kn,";
}
}
空速解释类Speed,终结符表达式。
public sealed class Movement : IWord {
private string _movement = String.Empty;
public Movement(string movement) {
this._movement = movement;
}
private Dictionary<string, string> _movements = new Dictionary<string, string> {
{"taxing","taxing on the runway"},
{"takeoff","take off from the runway"},
{"fly","flying in the sky"},
{"cruise","navigate a cruise"},
{"landing","landing on the runway"},
};
public string Interpret() {
return "movement:" + _movements[_movement] + ",";
}
}
运动解释类Movement,终结符表达式。
public sealed class Voyage : IWord {
private double _voyage = 0;
public Voyage(double voyage) {
this._voyage = voyage;
}
public string Interpret() {
return "voyage:" + _voyage.ToString() + "km.";
}
}
航程解释类Voyage,终结符表达式。
public sealed class Semicolon : IWord {
private IWord _left = null;
private IWord _right = null;
public Semicolon(IWord left, IWord right) {
this._left = left;
this._right = right;
}
public string Interpret() {
return _left.Interpret() + Environment.NewLine + _right.Interpret();
}
}
分号解释类Semicolon,非终结符表达式。
public sealed class Instruction : IWord {
private IWord _course = null;
private IWord _speed = null;
private IWord _movement = null;
private IWord _voyage = null;
public Instruction(IWord course, IWord speed, IWord movement, IWord voyage) {
this._course = course;
this._speed = speed;
this._movement = movement;
this._voyage = voyage;
}
public string Interpret() {
return _course.Interpret() +
_speed.Interpret() +
_movement.Interpret() +
_voyage.Interpret();
}
}
由非终结符表达式分隔开的所有终结符表达式构成一条完整的指令Instruction类,这个类包含一个解释方法Interpret。
public class Interpreter {
private IWord _word = null;
private Instruction _instruction = null;
public string Interpret(string instruction) {
string[] instrucs = instruction.Split(';');
foreach(var word in instrucs) {
if(word.Trim() == "") break;
string[] words = word.Split(' ');
_instruction = new Instruction(new Course(double.Parse(words[0])),
new Speed(double.Parse(words[1])),
new Movement(words[2]),
new Voyage(double.Parse(words[3])));
if(_word == null) {
_word = _instruction;
} else {
_word = new Semicolon(_word, _instruction);
}
}
return _word.Interpret();
}
}
解释类Interpreter,充当环境类,此类最终构建一个表达式树并完成所有指令的解释动作。
public class Program {
private static Interpreter _interpreter = new Interpreter();
public static void Main(string[] args) {
string instruction = "340.00 10.00 taxing 1.00;" +
"27.00 120.00 takeoff 1.00;" +
"90.00 350.00 fly 30.00;" +
"180.00 400.00 cruise 230.00;" +
"50.00 320.00 fly 20.00;" +
"320.00 110.00 landing 3.00;"+
"120.00 10.00 taxing 3.00;";
Console.WriteLine(_interpreter.Interpret(instruction));
Console.ReadKey();
}
}
以上是调用方的代码,以下是这个案例的输出结果:
heading:340°,speed:10kn,movement:taxing on the runway,voyage:1km.
heading:27°,speed:120kn,movement:take off from the runway,voyage:1km.
heading:90°,speed:350kn,movement:flying in the sky,voyage:30km.
heading:180°,speed:400kn,movement:navigate a cruise,voyage:230km.
heading:50°,speed:320kn,movement:flying in the sky,voyage:20km.
heading:320°,speed:110kn,movement:landing on the runway,voyage:3km.
heading:120°,speed:10kn,movement:taxing on the runway,voyage:3km.
<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">
解释器模式(Interpreter Pattern)在某些情况下可以提供一些优点,尤其是在处理特定类型的问题时。以下是解释器模式的一些优点:
尽管解释器模式具有这些优点,但它也有一些缺点,例如在处理大型表达式或频繁修改语法规则时可能会导致性能问题。因此,在选择是否使用解释器模式时,需要根据具体的问题和需求进行权衡和考虑。
解释器模式(Interpreter Pattern)虽然在某些情况下具有优点,但也存在一些明显的缺点和限制,包括:
解释器模式是一种强大的设计模式,但它并不适用于所有情况。在使用解释器模式时,需要仔细权衡其优点和缺点,并确保其适用于特定的问题和需求。如果不需要处理复杂的语法解释或性能要求很高,可能有更简单和高效的解决方
解释器模式(Interpreter Pattern)适用于特定的场景和问题,通常在以下情况下可以考虑使用解释器模式:
总的来说,解释器模式适用于需要解释、解析和执行特定语法规则或规则集的情况。它允许将语法规则表示为抽象语法树,并通过逐步解释树节点来执行相应的操作。使用解释器模式可以使得处理复杂的语法和规则变得更加灵活和可维释器模式(Interpreter Pattern)适用于以下场景:
解释器模式通过将语法规则表示为抽象语法树,然后通过解释器逐步解释树节点来执行相应操作,使得处理复杂的语法和规则变得更加灵活和可维护。