一、解释器模式
翻译:将老板的话用一定的语法规则翻译过来——听懂老板的话
(一)、名称:解释器模式(interpreter)
(二)、属性:一种行为模式
(三)、定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器用这个语言的所定义的文法的表示来解释语言中的句子
(四)、白话:每种语言都有它的语法表现规则,通过定义一个解释器,用这个解释器来解释这个语言中的句子(提供了评估语言的语法或表达式的方式,它属于行为型模式。这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在SQL 解析、符号处理引擎等。
(五)、作用:对于一些固定文法构建一个解释句子的解释器
(六):何时使用:当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式
(七)、优点:使用解释器模式可以很容易的改变和扩展文法,因为该模式使用类来表示文法规则,可以使用继承来改变或扩展该文法,也比较也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,这些类都易于直接编写。
(八)、不足:解释器模式给文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护,建议当文法非常复杂是,使用其他的技术如语法分析程序或编译器生成器来处理。
(九)、使用的场景:、
1、可以将一个需要解释执行的语句中的句子表示为一个抽象语法树。
2、一些重复出现的问题可以用一种简单的语言来进行表达。
3、一个简单语法需要解释的场景。
(十)、类图:
(十一)、如何使用(基本代码):
1、抽闲表达式:声明一个抽象的解释器操作,这个接口为抽象语法树中所有的节点所共享:
abstract classAbstractExpression
{
Public abstract void Interpret(Context);
}
2、TeminalExpression:AbstractExpression
{
Public overried void Interpret(Context context)
}
二、适配器模式
一句话:姚明初入NBA需要翻译同教练交流
(一)、名称:适配器模式(Adapter)
(二)、属性:结构型
(三)、定义:将一个类的接口转换成用户希望的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
(四)、白话:让接口不同的类通过适配器模式可以一起工作
(五)、作用:同上
(六)、何时使用:
1、系统需要使用现有的类,但是此时的类不符合系统的需要。
2、想要建立一个可以重复使用的类,用于一些彼此之间谜语太大关联的一些类,包括一些可能将来引进的类一起工作,这些源类不一定有一致的接口,
3、使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不同时,就应该使用适配器模式
4、两个类所做的事情相同或相似,但是具有不同的接口时要使用
5、双发都不太容易修改的时候使用适配器模式适配。
(七)、优点:1、可以让任何两个没有关联的类一起运行。
2、提高了类的复用,
3、增加了类的透明度
4、灵活性好
(八)、不足:
1、过多的使用适配器会让系统非常零乱,不易整体把握,如果不是很有必要,可以不使用适配器, 而是对系统进行重构
(九)、使用场景:有机动的修改一个正常运行的系统的接口,这时候应该考虑使用适配器模式。
(十)、注意事项:适配器不是在详细设计时添加的,而是解决正在使用的项目的问题。
(十一)、类图:
(十二)、如何使用
客户端代码
static voidMain(string[] args)
{
Target target = new Adapter();
target.Request();
Console.Read();
}
Target类代码
//Traget是客户所期待的接口,目标可以是具体的或抽象的类,也可以是接口
class Target
{
public virtual void Request()
{
Console.WriteLine("普通请求!");
}
}
Adaptee类代码
//Adaptee需要适配的类
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求!");
}
}
Adapter类
//Adaptee需要适配的类
class Adaptee
{
public void SpecificRequest()
{
Console.WriteLine("特殊请求!");
}
}
三、总结:同点:都需要一个中介
不同点:解释器模式是对语法的操作,适配器是针对接口的操作