跳转至

解释器模式

分类:行为型模式。

类结构

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 : 执行动作

协作过程

  1. 把一段控制指令整理为表达式树;例如把飞行、鸣叫、右转三个动作放进一个顺序表达式。
  2. 如果需要重复动作,再用重复表达式包裹该顺序表达式。
  3. 从根节点调用 interpret(context),非终结符按组合规则解释子节点。
  4. 基本动作节点调用上下文的对应操作,更新模拟鸭子的行为或状态。

场景来源(Google Books 原书公开检索片段;示例类图为本笔记整理):

评论