Swift设计模式之解释器模式
2016-05-12 11:37
369 查看
转自
Swift设计模式
原文
Design-Patterns-In-Swift
Swift设计模式
原文
Design-Patterns-In-Swift
// 解释器模式 // 百度百科:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子 // 设计模式分类:行为型模式 /** * 表达式接口 */ protocol IntegerExp { /** 取值 - parameter context: 上下文 - returns: 值 */ func evaluate(context: IntegerContext) -> Int /** 替换 - parameter character: 字符 - parameter integerExp: 表达式 - returns: <#return value description#> */ func replace(character: Character, integerExp: IntegerExp) -> IntegerExp /** 复制 - returns: 表达式 */ func copy() -> IntegerExp } /// 上下文 class IntegerContext { /// 数据字典 private var data: [Character:Int] = [:] /** 查找 - parameter name: 字符 - returns: 字符代表的值 */ func lookup(name: Character) -> Int { return self.data[name]! } /** 分配值 - parameter integerVarExp: 变量表达式 - parameter value: 值 */ func assign(integerVarExp: IntegerVarExp, value: Int) { self.data[integerVarExp.name] = value } } /// 变量表达式 class IntegerVarExp: IntegerExp { let name: Character init(name: Character) { self.name = name } func evaluate(context: IntegerContext) -> Int { return context.lookup(self.name) } func replace(name: Character, integerExp: IntegerExp) -> IntegerExp { if name == self.name { return integerExp.copy() } else { return IntegerVarExp(name: self.name) } } func copy() -> IntegerExp { return IntegerVarExp(name: self.name) } } /// 加表达式 class AddExp: IntegerExp { /// 操作数1 private var operand1: IntegerExp /// 操作数2 private var operand2: IntegerExp init(op1: IntegerExp, op2: IntegerExp) { self.operand1 = op1 self.operand2 = op2 } func evaluate(context: IntegerContext) -> Int { return self.operand1.evaluate(context) + self.operand2.evaluate(context) } func replace(character: Character, integerExp: IntegerExp) -> IntegerExp { return AddExp(op1: operand1.replace(character, integerExp: integerExp), op2: operand2.replace(character, integerExp: integerExp)) } func copy() -> IntegerExp { return AddExp(op1: self.operand1, op2: self.operand2) } } /// 减表达式 class SubtractExp: IntegerExp { /// 操作数1 private var operand1: IntegerExp /// 操作数2 private var operand2: IntegerExp init(op1: IntegerExp, op2: IntegerExp) { self.operand1 = op1 self.operand2 = op2 } func evaluate(context: IntegerContext) -> Int { return self.operand1.evaluate(context) - self.operand2.evaluate(context) } func replace(character: Character, integerExp: IntegerExp) -> IntegerExp { return AddExp(op1: operand1.replace(character, integerExp: integerExp), op2: operand2.replace(character, integerExp: integerExp)) } func copy() -> IntegerExp { return AddExp(op1: self.operand1, op2: self.operand2) } } var a = IntegerVarExp(name: "A") var b = IntegerVarExp(name: "B") var c = IntegerVarExp(name: "C") // 创建一个表达式 a - (b + c) var expression: IntegerExp = SubtractExp(op1: a, op2: AddExp(op1: b, op2: c)) // a - (b + c) // 创建一个上下文 var intContext = IntegerContext() intContext.assign(a, value: 2) // a = 2 intContext.assign(b, value: 1) // b = 1 intContext.assign(c, value: 3) // c = 3 // 在上下文环境中执行表达式 var result = expression.evaluate(intContext) // 2 - (1 + 3) = -2
相关文章推荐
- Swift设计模式之命令模式
- Swift设计模式之桥梁模式
- Swift设计模式之适配器模式
- Swift设计模式之外观模式
- Swift设计模式之原型模式
- Swift设计模式之责任链模式
- Swift设计模式之中介者模式
- Swift设计模式之装饰模式
- Swift设计模式之状态模式
- Swift设计模式之组合模式
- 苹果新贵 Swift 之前世今生
- Swift静态方法
- 在OC项目中添加Swift文件并实现混合编程
- 在OC项目中添加Swift文件并实现混合编程
- C# 委托,Lambda表达式 and Swift 委托,闭包
- Swift 实现俄罗斯方块详细思路解析(附完整项目)
- swift下载文件并且保存到沙盒
- Swift溢出
- 【Swift学习】Swift编程之旅---ARC(二十)
- 集成百度地图SDK(swift)