解释器模式¶
分类:行为型模式。
类结构¶
classDiagram
direction TB
class Client
class Context {
+lookup(String name) Object
}
class AbstractExpression {
<<interface>>
+interpret(Context context)
}
class TerminalExpression {
+interpret(Context context)
}
class NonterminalExpression {
+interpret(Context context)
}
Client ..> AbstractExpression : 构建并求值
Client --> Context : 提供上下文
AbstractExpression ..> Context : 读取解释所需信息
AbstractExpression <|.. TerminalExpression
AbstractExpression <|.. NonterminalExpression
NonterminalExpression o-- "0..*" AbstractExpression : 子表达式
角色定义¶
| 角色 | 定义 |
|---|---|
| Client(客户) | 构造表示语法的表达式树,准备上下文,并发起解释。 |
| Context(上下文) | 保存解释过程需要的变量、符号等信息,供表达式访问。 |
| AbstractExpression(抽象表达式) | 声明所有表达式都支持的解释操作。 |
| TerminalExpression(终结符表达式) | 实现终结符的解释规则,不再递归解释子表达式。 |
| NonterminalExpression(非终结符表达式) | 持有子表达式,根据语法规则组合并解释它们;子表达式数量由具体语法决定。 |
Head First 示例:用简单语言控制鸭子¶
《Head First Design Patterns》第一版附录提出 Duck Pond Simulator:孩子用一种简单语言控制模拟鸭子,执行飞行、呱呱叫、向右转等动作。把语法结构表示为对象,就可以逐个解释并执行程序。
以下是这个场景的**教学建模**,不是原书完整语法或作者源码。类名、上下文与 SequenceExpression、RepeatExpression 的具体接口由本笔记定义,用“按顺序执行”“重复执行”说明非终结符如何组合终结符;这里的 DuckContext 也不是策略模式示例中的 Duck 类。
| 示例类型 | 模式角色 | 职责 |
|---|---|---|
| DuckExpression | 抽象表达式 | 声明在鸭子上下文中解释执行的操作。 |
| FlyExpression / QuackExpression / TurnRightExpression | 终结符表达式 | 分别解释一个基本动作,把执行委托给上下文。 |
| SequenceExpression | 非终结符表达式 | 保存一组子表达式,并按顺序解释。 |
| RepeatExpression | 非终结符表达式 | 保存重复次数和一个子表达式,重复解释该子表达式。 |
| DuckContext | 上下文 | 保存当前模拟鸭子的运行状态,并提供执行动作的能力。 |
示例 UML¶
classDiagram
direction TB
class DuckExpression {
<<interface>>
+interpret(DuckContext context)
}
class FlyExpression {
+interpret(DuckContext context)
}
class QuackExpression {
+interpret(DuckContext context)
}
class TurnRightExpression {
+interpret(DuckContext context)
}
class SequenceExpression {
+interpret(DuckContext context)
}
class RepeatExpression {
-int times
+interpret(DuckContext context)
}
class DuckContext {
+fly()
+quack()
+turnRight()
}
DuckExpression <|.. FlyExpression
DuckExpression <|.. QuackExpression
DuckExpression <|.. TurnRightExpression
DuckExpression <|.. SequenceExpression
DuckExpression <|.. RepeatExpression
SequenceExpression o-- "0..*" DuckExpression : 按顺序解释
RepeatExpression --> DuckExpression : 重复解释
DuckExpression ..> DuckContext : 执行动作
协作过程¶
- 把一段控制指令整理为表达式树;例如把飞行、鸣叫、右转三个动作放进一个顺序表达式。
- 如果需要重复动作,再用重复表达式包裹该顺序表达式。
- 从根节点调用
interpret(context),非终结符按组合规则解释子节点。 - 基本动作节点调用上下文的对应操作,更新模拟鸭子的行为或状态。
场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):