设计模式之解释器模式(Interpreter)摘录
23種GOF設(shè)計模式一般分為三大類:創(chuàng)建型模式、結(jié)構(gòu)型模式、行為模式。
創(chuàng)建型模式抽象了實例化過程,它們幫助一個系統(tǒng)獨立于如何創(chuàng)建、組合和表示它的那些對象。一個類創(chuàng)建型模式使用繼承改變被實例化的類,而一個對象創(chuàng)建型模式將實例化委托給另一個對象。創(chuàng)建型模式有兩個不斷出現(xiàn)的主旋律。第一,它們都將關(guān)于該系統(tǒng)使用哪些具體的類的信息封裝起來。第二,它們隱藏了這些類的實例是如何被創(chuàng)建和放在一起的。整個系統(tǒng)關(guān)于這些對象所知道的是由抽象類所定義的接口。因此,創(chuàng)建型模式在什么被創(chuàng)建,誰創(chuàng)建它,它是怎樣被創(chuàng)建的,以及何時創(chuàng)建這些方面給予了很大的靈活性。它們允許用結(jié)構(gòu)和功能差別很大的“產(chǎn)品”對象配置一個系統(tǒng)。配置可以是靜態(tài)的(即在編譯時指定),也可以是動態(tài)的(在運(yùn)行時)。
結(jié)構(gòu)型模式涉及到如何組合類和對象以獲得更大的結(jié)構(gòu)。結(jié)構(gòu)型類模式采用繼承機(jī)制來組合接口或?qū)崿F(xiàn)。結(jié)構(gòu)型對象模式不是對接口和實現(xiàn)進(jìn)行組合,而是描述了如何對一些對象進(jìn)行組合,從而實現(xiàn)新功能的一些方法。因為可以在運(yùn)行時刻改變對象組合關(guān)系,所以對象組合方式具有更大的靈活性,而這種機(jī)制用靜態(tài)類組合是不可能實現(xiàn)的。
行為模式涉及到算法和對象間職責(zé)的分配。行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運(yùn)行時難以跟蹤的復(fù)雜的控制流。它們將用戶的注意力從控制流轉(zhuǎn)移到對象間的聯(lián)系方式上來。行為類模式使用繼承機(jī)制在類間分派行為。行為對象模式使用對象復(fù)合而不是繼承。一些行為對象模式描述了一組對等的對象怎樣相互協(xié)作以完成其中任一個對象都無法單獨完成的任務(wù)。
創(chuàng)建型模式包括:1、FactoryMethod(工廠方法模式);2、Abstract Factory(抽象工廠模式);3、Singleton(單例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).
結(jié)構(gòu)型模式包括:6、Bridge(橋接模式);7、Adapter(適配器模式);8、Decorator(裝飾模式);9、Composite(組合模式);10、Flyweight(享元模式);11、Facade(外觀模式);12、Proxy(代理模式).
行為模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(狀態(tài)模式);16、Observer(觀察者模式);17、Memento(備忘錄模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(訪問者模式);21、Chain of Responsibility(責(zé)任鏈模式);22、Iterator(迭代器模式);23、Interpreter(解釋器模式).
Factory Method:定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實例化。Factory Method使一個類的實例化延遲到其子類。
Abstract Factory:提供一個創(chuàng)建一系列相關(guān)或相互依賴對象的接口,而無需指定他們具體的類。
Singleton:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
Builder:將一個復(fù)雜對象的構(gòu)建與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的表示。
Prototype:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這個原型來創(chuàng)建新的對象。
Bridge:將抽象部分與它的實現(xiàn)部分分離,使它們都可以獨立地變化。
Adapter:將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
Decorator:動態(tài)地給一個對象添加一些額外的職責(zé)。就擴(kuò)展功能而言, Decorator模式比生成子類方式更為靈活。
Composite:將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。Composite使得客戶對單個對象和復(fù)合對象的使用具有一致性。
Flyweight:運(yùn)用共享技術(shù)有效地支持大量細(xì)粒度的對象。
Facade:為子系統(tǒng)中的一組接口提供一個一致的界面, Facade模式定義了一個高層接口,這個接口使得這一子系統(tǒng)更加容易使用。
Proxy:為其他對象提供一個代理以控制對這個對象的訪問。
Template Method:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟。
Strategy:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。本模式使得算法的變化可獨立于使用它的客戶。
State:允許一個對象在其內(nèi)部狀態(tài)改變時改變它的行為。對象看起來似乎修改了它所屬的類。
Observer:定義對象間的一種一對多的依賴關(guān)系,以便當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。
Memento:在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣以后就可將該對象恢復(fù)到保存的狀態(tài)。
Mediator:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互。
Command:將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進(jìn)行參數(shù)化;對請求排隊或記錄請求日志,以及支持可取消的操作。
Visitor:表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
Chain of Responsibility:為解除請求的發(fā)送者和接收者之間耦合,而使多個對象都有機(jī)會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。
Iterator:提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內(nèi)部表示。
Interpreter:給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用該表示來解釋語言中的句子。
???????? Interpreter:(1)、意圖:給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
???????? (2)、適用性:當(dāng)有一個語言需要解釋執(zhí)行,并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式。而當(dāng)存在以下情況時該模式效果最好:A、該文法簡單對于復(fù)雜的文法,文法的類層次變得龐大而無法管理。此時語法分析程序生成器這樣的工具是更好的選擇。它們無需構(gòu)建抽象語法樹即可解釋表達(dá)式,這樣可以節(jié)省空間而且還可能節(jié)省時間。B、效率不是一個關(guān)鍵問題最高效的解釋器通常不是通過直接解釋語法分析樹實現(xiàn)的,而是首先將它們轉(zhuǎn)換成另一種形式。例如,正則表達(dá)式通常被轉(zhuǎn)換成狀態(tài)機(jī)。但即使在這種情況下,轉(zhuǎn)換器仍可用解釋器模式實現(xiàn),該模式仍是有用的。
???????? (3)、優(yōu)缺點:A、易于改變和擴(kuò)展文法:因為該模式使用類來表示文法規(guī)則,你可使用繼承來改變或擴(kuò)展該文法。已有的表達(dá)式可被增量式地改變,而新的表達(dá)式可定義為舊表達(dá)式的變體。B、也易于實現(xiàn)文法:定義抽象語法樹中各個節(jié)點的類的實現(xiàn)大體類似。這些類易于直接編寫,通常它們也可用一個編譯器或語法分析程序生成器自動生成。C、復(fù)雜的文法難以維護(hù):解釋器模式為文法中的每一條規(guī)則至少定義了一個類(使用BNF定義的文法規(guī)則需要更多的類)。因此包含許多規(guī)則的文法可能難以管理和維護(hù)。可應(yīng)用其他的設(shè)計模式來緩解這一問題。但當(dāng)文法非常復(fù)雜時,其他的技術(shù)如語法分析程序或編譯器生成器更為合適。D、增加了新的解釋表達(dá)式的方式:解釋器模式使得實現(xiàn)新表達(dá)式”計算”變得容易。例如,你可以在表達(dá)式類上定義一個新的操作以支持優(yōu)美打印或表達(dá)式的類型檢查。如果你經(jīng)常創(chuàng)建新的解釋表達(dá)式的方式,那么可以考慮使用Visitor模式以避免修改這些代表文法的類。
???????? (4)、相關(guān)模式:A、Composite模式:抽象語法樹是一個復(fù)合模式的實例。B、Flyweight模式:說明了如何在抽象語法樹中共享終結(jié)符。C、Iterator:解釋器可用一個迭代器遍歷該結(jié)構(gòu)。D、Visitor:可用來在一個類中維護(hù)抽象語法樹中的各節(jié)點的行為。
???????? (5)、Interpreter模式的目的就是使用一個解釋器為用戶提供一個一門定義語言的語法表示的解釋器,然后通過這個解釋器來解釋語言中的句子。Interpreter模式中,提供了TerminalExpression和NonterminalExpression兩種表達(dá)式的解釋方式,Context類用于為解釋過程提供一些附加的信息(例如全局的信息)
示例代碼1:
#include <iostream>
#include <string>
#include <vector>using namespace std;class Context;class AbstractExpression
{
public:virtual void Interpret(Context* context) = 0;
};class Expression : public AbstractExpression
{
public:virtual void Interpret(Context* context){cout<<"終端解釋器"<<endl;}
};class NonterminalExpression : public AbstractExpression
{
public:virtual void Interpret(Context* context){cout<<"非終端解釋器"<<endl;}
};class Context
{
public:string input;string output;
};//客戶端
int main()
{Context* context = new Context();vector<AbstractExpression*> express;express.push_back(new Expression());express.push_back(new NonterminalExpression());express.push_back(new NonterminalExpression());vector<AbstractExpression*>::iterator p = express.begin();while (p != express.end()) {(*p)->Interpret(context);p ++;}/*result終端解釋器非終端解釋器非終端解釋器*/return 0;
}
示例代碼2:
Context.h:
#ifndef _CONTEXT_H_
#define _CONTEXT_H_class Context
{
public:Context();~Context();
protected:
private:
};#endif//~_CONTEXT_H_
Context.cpp:
#include "Context.h"Context::Context()
{}Context::~Context()
{}
Interpret.h:
#ifndef _INTERPRET_H_
#define _INTERPRET_H_#include "Context.h"
#include <string>using namespace std;class AbstractExpression
{
public:virtual ~AbstractExpression();virtual void Interpret(const Context& c);
protected:AbstractExpression();
private:
};class TerminalExpression : public AbstractExpression
{
public:TerminalExpression(const string& statement);~TerminalExpression();void Interpret(const Context& c);
protected:
private:string _statement;
};class NonterminalExpression : public AbstractExpression
{
public:NonterminalExpression(AbstractExpression* expression, int times);~NonterminalExpression();void Interpret(const Context& c);
protected:
private:AbstractExpression* _expression;int _times;
};#endif//~_INTERPRET_H_
Interpret.cpp:
#include "Interpret.h"
#include <iostream>using namespace std;AbstractExpression::AbstractExpression()
{}AbstractExpression::~AbstractExpression()
{}void AbstractExpression::Interpret(const Context& c)
{}TerminalExpression::TerminalExpression(const string& statement)
{this->_statement = statement;
}TerminalExpression::~TerminalExpression()
{}void TerminalExpression::Interpret(const Context& c)
{cout<<this->_statement<<"TerminalExpression"<<endl;
}NonterminalExpression::NonterminalExpression(AbstractExpression* expression, int times)
{this->_expression = expression;this->_times = times;
}NonterminalExpression::~NonterminalExpression()
{}void NonterminalExpression::Interpret(const Context& c)
{for (int i = 0; i < _times; i ++)this->_expression->Interpret(c);
}
main.cpp:
#include "Context.h"
#include "Interpret.h"
#include <iostream>using namespace std;int main()
{Context* c = new Context();AbstractExpression* te = new TerminalExpression("hello");AbstractExpression* nte = new NonterminalExpression(te, 2);nte->Interpret(*c);/*resulthelloTerminalExpressionhelloTerminalExpression*/return 0;
}
解釋器模式結(jié)構(gòu)圖:
參考文獻(xiàn):
1、《大話設(shè)計模式C++》
2、《設(shè)計模式精解----GoF23種設(shè)計模式解析》
3、《設(shè)計模式----可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
總結(jié)
以上是生活随笔為你收集整理的设计模式之解释器模式(Interpreter)摘录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式之迭代器模式(Iterator)
- 下一篇: NEON在Android中的使用举例