設計模式 27 其實你不懂老闆的心 直譯器模式

2021-07-04 13:26:40 字數 2202 閱讀 4587

直譯器模式:給定乙個語言,定義它的文法的一種表示,並定義乙個直譯器,這個直譯器使用該表示來解釋該語言中的句子。

適用於:如果一種特定型別的問題發生的頻率足夠高,那麼可能就值得將該問題的各個實力表述為乙個簡單語言中的句子。這樣就可以構建乙個直譯器:該直譯器通過解釋這些句子來解決該問題。

當有乙個語言需要解釋執行時,並且你可將該語言中的句子表示為乙個抽象語法樹時,可以使用直譯器模式。

好處:很容易改變和擴充套件文法,因為該模式使用類來表示文法規則,你可以使用整合來改變或擴充套件該文法。也比較容易實現文法,因為定義抽象語法樹中各個節點的類的實現大體類似,這些類都易於直接編寫。

缺點:為文法中的每一條規則至少定義了乙個類,因此包含許多規則的文法可能難以管理和維護。當文法非常複雜時,使用其他的技術如語法分析程式或編譯器生成器來處理。

說白了,就是將一句話,轉變成實際的命令執行。

例項:正規表示式的解析。

abstractexpression(抽象表示式),生命乙個抽象的解釋操作,這個藉口為抽象語法樹中所有的節點所共享。

terminalexpression(終結符表示式):實現與文法中的終結符相關聯的解釋操作。實現抽象表示式中所要求的藉口,主要是interpret()方法。文法中每乙個終結符都有乙個具體終結表示式與之相對應。

nonterminalexpression(非終結符表示式):為文法中的非終結符實現解釋操作,對文法中的每一條規則r1,r2,…,rn都需要乙個具體的非終結符表示式類。通過實現抽象表示式的interpret()方法實現解釋操作。解釋操作以遞迴方式呼叫上面所提到的代表r1,r2,…,rn中各個符號的例項變數。

main.cpp

#include #include #include #include #include "context.h"

#include "abstractexpression.h"

using namespace std;

void process()

}int main(int argc,char* argv)

context.h

#ifndef context_h

#define context_h

#include using namespace std;

class context

;#endif

context.cpp

#include "context.h"

context::context(void)

context::~context(void)

abstractexpression.h

#ifndef abstactepression_h

#define abstactepression_h

class context;

//抽象表示式

class abstractexpression

;//終結符表示式

class terminalexpression : public abstractexpression

;//非終結符表示式

class nonterminalexpression : public abstractexpression

;#endif

abstractexpression.cpp

#include "abstractexpression.h"

#include using namespace std;

abstractexpression::abstractexpression(void)

abstractexpression::~abstractexpression(void)

void abstractexpression::interpret(const context& context)

void terminalexpression::interpret(const context& context)

void nonterminalexpression::interpret(const context& context)

設計模式 委派模式 注重結果的老闆

委派模式不屬於23中設計模式中的一種。他和 模式很像,負責任務的呼叫和分配,可以看做是一種特殊情況下的靜態 的全權 但是 注重過程,而委派注重結果。委派模式在spring中應用很多,比如dispatchservlet就用到了委派模式。現在我們來實現乙個場景,老闆給專案經理下達任務,專案經理就會根據情...

你還不懂Redis的發布訂閱模式呢?

一 什麼是發布訂閱 其實就是mq,被訂閱者寫訊息,訂閱者們實時讀到訊息進行處理。在說這之前,前面提到的list型別blpop也是可以模擬單播阻塞佇列的。但是他終歸是模擬。redis為我們提供了屬於他自己的發布訂閱。核心命令 只有已訂閱的客戶端才能收到訊息,比如我給test傳送了一條helloworl...

用同理心顛覆你的產品設計流程

我先前在 myedu 擔任設計副總裁,我們致力於幫助大學生順利完成學業,展現他們的學術成就,並找到工作。最初,myedu 提供一系列免費的學業規劃工具,包括日程規劃器。我們正式擬定了乙個鎖定大學院校招聘活動的商業模式,並針對大學生與招聘人員 進行了行為與同理心的研究。這類質性研究,著重的是人們做了什...