23设计模式之解释器模式(Interpreter)



一、概述

        Interpreter属于行为型模式中的一种,给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。

二、适用性

        当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。而当存在以下情况时该模式效果最好:
        1. 该文法简单对于复杂的文法,文法的类层次变得庞大而无法管理。
        2. 效率不是一个关键问题最高效的解释器通常不是通过直接解释语法分析树实现的,而是首先将它们转换成另一种形式。

三、参与者

        1. AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。
        2. TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。
        3. NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释(Interpret)操作。
        4. Context(上下文):包含解释器之外的一些全局信息。
        5. Client(客户):构建(或被给定)表示该文法定义的语言中一个特定的句子的抽象语法树。该抽象语法树由NonterminalExpression和TerminalExpression的实例装配而成。调用解释操作。

四、类图 



五、代码实现 

1. AbstractExpression(抽象表达式):声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享。

Expression.swift

//
//  Expression.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/4.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// 声明一个抽象的解释操作,这个接口为抽象语法树中所有的节点所共享
protocol Expression {
    
    func interpret(contextIn:ContextIn)

}

2. TerminalExpression(终结符表达式):实现与文法中的终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例。NonterminalExpression(非终结符表达式):为文法中的非终结符实现解释(Interpret)操作。

a) AdvanceExpression.swift

//
//  AdvanceExpression.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/4.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

class AdvanceExpression: Expression {
    
    func interpret(contextIn: ContextIn){
        print("\(contextIn.contentIn) 这是高级解析器!")
    }
}

b) SimpleExpression.swift

//
//  SimpleExpression.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/4.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

class SimpleExpression: Expression {
    
    func interpret(contextIn: ContextIn) {
        print("\(contextIn.contentIn) 这是普通解析器!")
    }
    
}


3. Context(上下文):包含解释器之外的一些全局信息。

Context.swift

//
//  Context.swift
//  23设计模式
//
//  Created by 阳君 on 14/12/4.
//  Copyright (c) 2014年 六月. All rights reserved.
//

import Foundation

/// Context(上下文)包含解释器之外的一些全局信息
class ContextIn {
    
    /// 全局信息
    var contentIn:String = ""
    /// 解释器数组
    var list:[Expression] = []
    
    init() {
        
    }
    
    // MARK: 增加
    func add(expression:Expression) {
        self.list.append(expression)
    }

}

六、测试

1. 代码

// 解释器模式
let ctx = ContextIn()
ctx.contentIn = "ContextIn"
ctx.add(AdvanceExpression())
ctx.add(SimpleExpression())
for ex in ctx.list {
    ex.interpret(ctx)
}

2. 运行结果

ContextIn 这是高级解析器!

ContextIn 这是普通解析器! 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值