[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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章