解释器模式分析、结构图及基本代码



定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

适用地:当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。像正则表达式、浏览器应用等等。

优点是可以很容易地扩展和改变文法,因为该模式使用类来表示文法规则,你可使用继承来改变或扩展该文法。也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体相似,这些都易于直接编写。

缺点是解释器为文法中的每一种规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。建议当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。

结构图:

基本代码:

using System;

using System.Collections.Generic;

using System.Text;

namespace 解释器模式

{

class Program

{

static void Main(string[] args)

{

Context context = new Context();

IList<AbstractExpression> list = new List<AbstractExpression>();

list.Add(new TerminalExpression());

list.Add(new NonterminalExpression());

list.Add(new TerminalExpression());

list.Add(new TerminalExpression());

foreach (AbstractExpression exp in list)

{

exp.Interpret(context);

}

Console.Read();

}

}

class Context

{

private string input;

public string Input

{

get { return input; }

set { input = value; }

}

private string output;

public string Output

{

get { return output; }

set { output = value; }

}

}

abstract class AbstractExpression

{

public abstract void Interpret(Context context);

}

class TerminalExpression : AbstractExpression

{

public override void Interpret(Context context)

{

Console.WriteLine("终端解释器");

}

}

class NonterminalExpression : AbstractExpression

{

public override void Interpret(Context context)

{

Console.WriteLine("非终端解释器");

}

}

}

时间: 2024-11-08 17:23:11

解释器模式分析、结构图及基本代码的相关文章

模板方法模式分析、结构图和基本代码

 定义:模板方法模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: AbstractClass是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法.这个模板方法一般是一个具体方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体方法. ConcreteClass,实现父类所定义的一个或多个抽象方法.每一个AbstractClass都可以有任

观察者模式分析、结构图及基本代码

 定义:观测者模式定义了一种一对多的依赖关系,让多个观测者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观测者对象,使它们能够自动更新自己. 结构图: Subject类,可翻译为主题或抽象通知者,一般用一个抽象类或者一个接口实现.它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者.抽象主题提供一个接口,可以增加和删除观测者. Observe类,抽象观测者,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己.这个接口叫更新接口.抽象观察者

迭代器模式分析、结构图及基本代码

定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示. 适用地方:当需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,就应该考虑用迭代器模式.或者当需要对聚集有多种方式遍历时,可以考虑使用迭代器模式. 尽管我们不需要显式地引用迭代器,但系统本身还是通过迭代器来实现遍历的.总的来说,迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据.迭代器模式在访问数组.集合.列表等数据

备忘录模式分析、结构图及基本代码

 定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 结构图: Originator(发起人):负责创建一个备忘录Memento,用以记录当前时刻它的内部状态,并可使用备忘录恢复内部状态.Originator可根据需要决定Memento存储Originator的哪些内部状态. Memento(备忘录):负责存储Originator对象的内部状态,并可防止Originator以外的其他对象访问备忘录Memento.备忘录

职责链模式分析、结构图与基本代码

?? 定义:使多个对象都有机会处理请求.从而避免请求的发送者和接收者之间的耦合关系.将这个对象连成一条链.并沿着这条链传递该请求,直到有一个对象处理它为止. 优点:当客户提交一个请求时,请求时沿链传递直至有一个ConcreteHandler对象负责处理它.这就使得接收者和发送者都没有对方的明白信息,且链中的对象自己也并不知道链的结构. 结果是职责链可简化对象的相互连接,它们仅需保持一个指向其后继者的引用,而不需保持它全部的候选接收者的引用.这就大大减少了耦合度了.因为式在client来定义链的结

中介者模式分析、结构图及基本代码

 定义:用一个中介对象来封装一系列的对象交互. 中介者使各对象不须要显式地相互引用.从而使其耦合松散,并且能够独立地改变它们之间的交互. 适用地方:中介者模式一般应用于一组对象以定义良好可是复杂的方式进行通信的场合以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合. 长处:中介者的出现降低了各个对象的耦合,使得能够独立地改变和复用各个对象类和中介类,比方不论什么国家的改变不会影响到其它国家,而仅仅是与安理会发生变化.其次,因为把对象怎样写作进行了抽象,将中介作为一个独立的概念并

訪问者模式的分析、结构图及基本代码

 之前我对全部的23种设计模式作了一个小总结.如今我们来对每一种设计模式作具体的分析.首先是訪问者模式: 定义:表示一个作用于某对象结构中的各元素的操作.它可使你能够在不改变各元素的类的前提下定义作用于这些元素的新操作. 适用地方:訪问者模式的目的是要把处理从数据结构分离出来.非常多系统能够依照算法和数据结构分开,假设这种系统有比較稳定的数据结构.又有易于变化的算法的话.使用訪问者模式就是比較合适的,由于訪问者模式使得算法操作的添加变得easy. 优缺点:訪问者模式的长处就是添加新的操作非常

适配器模式的分析、结构图及基本代码

 下面说说适配器模式: 定义:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 适用地方:在软件开发中,也就是系统的数据和行为都正确,但接口不符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配.适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 注意:要在双方都不太容易修改的时候再使用适配器模式适配. 开放-封闭原则:是说软件实体(类.模块.函数等等)应该可以扩展,但

桥接模式的分析、结构图及基本代码

 昨天探讨了访问者模式,今天来说说桥接模式: 定义:将抽象部分与它的实现部分分离,是它们可以独立地变化. 这并不是说,让抽象类与其派生类分离,因为这没有任何意义.实现指的是抽象类和它的派生类用来实现自己的对象. 理解:实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这种多角度分离出来让它们独立变化,减少它们之间的耦合. 下面讲一下合成/聚合复用原则: 合成/聚合复用原则就是尽量使用合成/聚合,尽量不要使用类继承.聚合表示一种弱的'拥有'关系,体现的是A对象可以包含B对象,但B对象不