第二十三章 Caché 设计模式 解释器模式

文章目录

  • 第二十三章 Caché 设计模式 解释器模式
  • 定义
  • 使用场景
  • 优点
  • 缺点
  • 结构图
  • 描述
  • 完整示例
    • 抽象解释器
    • 上下文
    • 终结符表达式
    • 非终结符表达式
    • 调用
  • 思考

第二十三章 Caché 设计模式 解释器模式

定义

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

使用场景

  • 如果一种特性类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,解释器通过解释这些句子来解决该问题。

  • 有一个简单的语法规则,比如编码转换.翻译。

  • 正则表达式,浏览器。

优点

扩展性强,若要新增乘,除,添加相应的非终结表达式,修改计算逻辑即可。

缺点

  • 需要建大量的类,因为每一种语法都要建一个非终结符的类。
  • 解释的时候采用递归调用方法,导致有时候函数的深度会很深,影响效率。

结构图

第二十三章 Caché 设计模式 解释器模式_第1张图片

描述

用abc来代替123数字。

完整示例

抽象解释器

Class PHA.YX.Design.Interpreter.Expression Extends %RegisteredObject
{

Method Interpreter(context As Context) As %Integer [ Abstract ]
{
	q 0
}

}

上下文

Class PHA.YX.Design.Interpreter.Context Extends %RegisteredObject
{

Property map As %ArrayOfDataTypes;

Method Add(s As Expression, value As %Integer)
{
	d ..map.SetAt(value, s)
}

Method Lookup(s As Expression)
{
	q ..map.GetAt(s)
}

}

终结符表达式

Class PHA.YX.Design.Interpreter.TerminalExpression Extends Expression
{

Property variable As %String;

Method %OnNew(variable As %String) As %Status [ Private, ServerOnly = 1 ]
{
	s ..variable = variable
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	q context.Lookup($this)
}

}

非终结符表达式

Class PHA.YX.Design.Interpreter.NonTerminalExpression Extends Expression
{

Property e1 As Expression;

Property e2 As Expression;

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
	s ..e1 = e1
	s ..e2 = e2
	Quit $$$OK
}

}

Class PHA.YX.Design.Interpreter.MinusOperation Extends NonTerminalExpression
{

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
    d ##super(e1, e2)
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	
	q ..e1.Interpreter(context) - ..e2.Interpreter(context)
}

}

Class PHA.YX.Design.Interpreter.PlusOperation Extends NonTerminalExpression
{

Method %OnNew(e1 As Expression, e2 As Expression) As %Status [ Private, ServerOnly = 1 ]
{
    d ##super(e1, e2)
	Quit $$$OK
}

Method Interpreter(context As Context) As %Integer
{
	q ..e1.Interpreter(context) + ..e2.Interpreter(context)
}

}

调用

/// d ##class(PHA.YX.Design.Program).Interpreter() 
ClassMethod Interpreter()
{
	s context = ##class(PHA.YX.Design.Interpreter.Context).%New()
	s a = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("a")
	s b = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("b")
	s c = ##class(PHA.YX.Design.Interpreter.TerminalExpression).%New("c")
	d context.Add(a, 4)
	d context.Add(b, 8)
	d context.Add(c, 6)
    s min= ##class(PHA.YX.Design.Interpreter.MinusOperation).%New(a,b).Interpreter(context)
	
	w min,!
	
	w ##class(PHA.YX.Design.Interpreter.MinusOperation).%New(##class(PHA.YX.Design.Interpreter.PlusOperation).%New(a, b), c).Interpreter(context),!
}

DHC-APP> d ##class(PHA.YX.Design.Program).Interpreter()
-4
6
 

思考

把数字解释解释成对应英文。

你可能感兴趣的:(Caché,设计模式)