天天看點

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

備忘錄(Menento)模式

定義:在不破壞封裝性的前提下,捕獲一個對象的内部狀态,并在該對象之外儲存這個狀态,以便以後當需要的時候能将該對象恢複到原先儲存的狀态。該模式又叫快照模式。

優缺點

優點:

  1. 提供了一種可以回複狀态的機制。使用者當需要時能夠比較友善地将資料恢複到某個曆史的狀态。
  2. 實作了内部狀态的封裝。除了建立它的發起人之外的其它對象都不能夠通路這些狀态資訊。
  3. 簡化了發起人類。發起人不需要管理和儲存其内部狀态的各個備份,所有狀态資訊都儲存在備忘錄中,并由管理者進行管理,這符合單一職責原則。

缺點:資源消耗大。如果要儲存的内部狀态資訊過多或者特别頻繁,将會占用比較大的記憶體資源。

應用場景

  1. 需要儲存與恢複資料的場景。如:玩遊戲時的中間結果的存檔功能。
  2. 需要提供一個可復原操作的場景。

主要角色

  1. 發起人(Originator)角色:記錄目前時刻的内部狀态資訊,提供建立備忘錄和恢複備忘錄資料的功能,實作其它業務功能,它可以通路備忘錄裡的所有資訊。
  2. 備忘錄(Memento)角色:負責存儲發起人的内部狀态,在需要的時候提供這些内部狀态給發起人。
  3. 管理者(Caretaker)角色:對備忘錄進行管理,提供儲存與擷取備忘錄的功能,但其不能對備忘錄的内容進行通路與修改。

結構圖

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

備忘錄執行個體

利用備忘錄模式設計“相親遊戲”。在四大美人中選一個美人當你的夫妻,不滿意可以進行撤銷。結構圖如下:

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

模式的擴充

備忘錄模式可以同原型模式混合使用。原型模式的clone()方法具有自動備份功能,是以,如果讓發起人實作Cloneable接口就有備份自己的功能,這時可以删除備忘錄類。結構圖如下:

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

解釋器(Interpreter)模式(不常用)

定義:給分析對象定義一個語言,并定義該語言的文法表示,再設計一個解析器來解釋語言中的句子。也就是說,用編譯語言的方式來分析應用中的執行個體。

優缺點

優點:

  1. 擴充性好。由于在解釋器模式中使用類來表示語言的文法規則,是以可以通過繼承等機制來改變或擴充文法;
  2. 容易實作。在文法樹中的每個表達式節點類都是相似的,是以實作其文法較為容易。

缺點:

  1. 執行效率較低。解釋器模式通常使用大量的循環和遞歸調用,當要解釋的句子較為複雜時,其運作速度很慢,且代碼的調試過程也比較麻煩;
  2. 會引起類膨脹。解釋器模式中的每條規則至少需要定義一個類,當包含的文法規則很多時,類的個數将急劇增加,導緻系統難以管理與維護。
  3. 可應用的場景比較少。在軟體開發中,需要定義語言文法的應用執行個體非常少,是以這種模式很少被使用到。

應用場景

  1. 當語言的文法較為簡單,且執行效率不是關鍵問題時。
  2. 當問題重複出現,且可以用一種簡單的語言來進行表達時。
  3. 當一個語言需要解釋執行,并且語言中的句子可以表示為一個抽象文法樹的時候,如:XML文檔解釋。

模式的結構與實作

文法:是用于描述語言的文法結構的形式規則。例如,中文中的“句子”的文法:

<句子> ::= <主語><謂語><賓語>

<主語> ::= <代詞> | <名詞>

<謂語> ::= <動詞>

<賓語> ::= <代詞> | <名詞>

<代詞> ::= 你 | 我 | 他

<名詞> ::= 大學生 | 英語

<動詞> ::= 是 | 學習

注意:這裡的符号“::=”表示“定義為”的意思,用“>”和“<”挂住的是非終極符,沒有挂住的是終結符。

句子:是語言的基本機關,是語言集中的一個元素,它由終結符和非終結符構成,能由“文法”推到出。如,上述文法可以推出“我是大學生”,是以它是句子。

文法樹:是句子結構的一種樹形表示,它代表了句子的推到結果,它有利于了解句子文法結構的層次。下圖是“我是大學生"的文法樹。

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

主要角色

  1. 抽象表達式(AbstractExpression)角色:定義解釋器的接口,約定解釋器的解釋操作,主要包含解釋方法interpret()。
  2. 終結符表達式(TerminalExpression)角色:是抽象表達式的子類,用來實作文法中與終極符相關的操作,文法中的每一個終結符都有一個具體中介表達式與之相對應。
  3. 非終結符表達式(NonterminalExpression)角色:也是抽象表達式的子類,用來實作文法中與非終極符相關的操作,文法中的每條規則都對應于一個非終結符表達式。
  4. 環境(Context)角色:通常包含各個解釋器需要的資料或是公共的功能,一般用來傳遞被所有解釋器共享的資料,後面的解釋器可以從這裡擷取這些值。
  5. 用戶端(Client):主要任務是:将需要分析的句子或表達式換成使用解釋器對象描述的抽象文法樹,然後調用解釋器的解釋方法,當然也可以通過環境角色間接通路解釋器的解釋方法。

結構圖

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

解釋器模式執行個體

公共汽車讀卡器可以判斷乘客的身份,如果是”韶關“或者”廣州“的”老人、婦女、兒童“可以免費乘車,其它人員乘車一次扣2元。

設定文法規則如下:

::= 的

::= 韶關 | 廣州

::= 老人 | 婦女 | 兒童

示例圖如下:

備忘錄模式、解釋器模式備忘錄(Menento)模式解釋器(Interpreter)模式(不常用)注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

注意:該文章内容采摘于《軟體設計模式(Java版)》,作者:程細柱

繼續閱讀