[GoF设计模式]Interpreter模式和Memento模式的C++实现

 

【Interpreter模式】-解释器模式

给定一个语言(如下例中的字符A,B...),定义它的文法表示(下例中的VariableContext,map中存放从字符到整数的转换),定义一个解释器,这个解释器使用该表示来解释语言中的句子。当有一个语言需要解释,并且你可以将该语言中的句子(如下例中的计算公式)表示成一个抽象语法树(公式中有更细的公式,复合计算)时,可以使用解释器模式。AbstractExpression声明一个抽象的解释操作,该节点为抽象语法树中所有的结点所共享。TerminalExpression终结符表达式,实现与文法中终结符相关联的解释操作。一个句子中的每个终结符需要该类的一个实例,如下例中的常数和变量。NonTerminalExpression非终结符表达式,对于文法中的每条规则,都需要一个该类,解释一般需要“递归的调用”解释操作interpret函数。Context上下文,包含解释器之外的全局信息。

“抽象语法树” “定义解释操作” “与Flyweight模式共享终结符-多次出现的同一个终结符只共享其单个拷贝”是解释器模式要考虑的问题

【图解】

下面的例子比较简单,如定义变量的加减乘除混合运算,为例子,构建VariableContext来存储所有的变量信息,用于解释终结符中的变量,终结表达式包括常数和变量,而非终结表达式则包括加减乘除规则。

1

 

【程序】

 

 

 

 

 

 

 

 

 

 

 

【输出】

 

2

 

 

【Memento模式】-备忘录模式

在不破坏封装的前提的下,捕获对象的内部状态,并在该对象之外(memento备忘录中)保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。一个Memento备忘录是一个对象,他存储另外一个对象在某一瞬间的内部状态,而后者称为备忘录的原发器(Originator)。当需要设置原发器的检查点时,取消操作机制会向原发器请求一个备忘录,原发器用描述当前状态的信息初始化该备忘录。只有原发器可以向备忘录中存储信息,备忘录对其可见,friend class而对其他对象则不见。在Gof中除了原发器和备忘录以外还增加了一个负责人Caretaker,负责管理好备忘录,但不能对备忘录的内容进行操作或检查。Originator向负责儿人Caretaker,提出备忘录申请,修改备忘录信息。

【图解】

以数据的状态为例,当数据更新前,NumberOriginator向负责人MementoManager提出备忘录申请,用备忘录来存放更新前的数据信息,然后更新自身数据到最新的状态,NumberOriginator需要回复数据时,则用之前保存到备忘录NumberMemento的数据进行回复,并同时将当前的数据存入备忘录,备忘录的操作同样想负责人提出请求。负责人貌似,其实也可以省略,刚开始写的程序没有负责人的角色,后来加的。注意friend class和private的使用。

 

【程序】

 

 

 

 

【输出】

2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值