設計模式26——解釋器模式

寫文章的初心主要是用來幫助自己快速的回憶這個模式該怎么用,主要是下面的UML圖可以起到大作用,在你學習過一遍以后可能會遺忘,忘記了不要緊,只要看一眼UML圖就能想起來了。同時也請大家多多指教。

解釋器模式(Interpreter)

類行為型模式。

目錄

一、概述

1.1、直觀的理解:

1.2、主要角色:

1.3、描述對象之間關系的UML圖:

1.4、適用場景:

二、代碼舉例

2.1、對象之間的關系用UML圖描述如下:

2.2、Java代碼如下:


一、概述

1、給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

1.1、直觀的理解

假設有2個解釋器按順序解釋內容,那么:

可以看到內容被解釋器一段一段的解釋和翻譯。

1.2、主要角色:

  • 解釋器:解釋器的抽象類或接口 + 具體的解釋器實現類 (包括:?終結符表達式 + 非終結符表達式
  • 內容(Context):被解釋的內容
  • 請求發起者(Client)

1.3、描述對象之間關系的UML圖:

1.4、適用場景:

?1、如果一種特定類型的問題發送的頻率足夠高,那么可能就值得將該問題的各個實例表述為一個簡單語言中的句子。這樣就可以構建一個解釋器,該解釋器通過解釋這些句子來解決該問題;

2、可以更容易地改變和擴展文法,因為該模式使用類來表示文法規則,你可以使用繼承來改變或擴展該文法;

3、當有一個語言需要解釋執行,并且你可將該語言中的句子表示為一個抽象語法樹時,可使用解釋器模式;

4、典型的例子有:正則表達式;

5、因為解釋器模式為文法中的每一條規則至少定義了一個類,所以文法非常復雜時,還是建議使用其他技術如語法分析程序或編譯器生成器來處理。

(注:當效率不是關鍵問題時,才會用此模式,如正則表達式更多情況下是轉換為狀態機來實現的。狀態機是什么?我一時也說不出來什么,不過你可以在練習編程算法的網站上找相關的題去學習題解或練習。)

二、代碼舉例

假設現有兩個解釋器用來解釋字符串的內容。

這個例子比較簡單,就不再詳細分析了。但你可以把本例當做一個模板,然后靈活使用:

2.1、對象之間的關系用UML圖描述如下:

2.2、Java代碼如下:

內容類:

public class Context {private String input;public String getInput() {return input;}public void setInput(String input) {this.input = input;}private String output;public String getOutput() {return output;}public void setOutput(String output) {this.output = output;}
}

解釋器的抽象類:

abstract class AbstractExpression {public abstract void interpret(Context context);
}

解釋器A:

public class ConcreteExpressionA extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解釋器A,處理中。。。。");}
}

解釋器B:

public class ConcreteExpressionB extends AbstractExpression {@Overridepublic void interpret(Context context) {System.out.println("解釋器B,處理中。。。。");}
}

主程序(發起請求的類):

public class Main {public static void main(String[] args) {Context context = new Context();//核心是解釋器如何處理內容,以下只是最簡單的舉例List<AbstractExpression> expressionList = new ArrayList<>();expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());expressionList.add(new ConcreteExpressionA());expressionList.add(new ConcreteExpressionB());for (AbstractExpression abstractExpression : expressionList) {abstractExpression.interpret(context);}}
}

這里就不再舉例了,可以把上面的Java例子復制到你本地,運行main函數試一下加深理解。這些代碼都是我自己學習的時候根據一些教材手敲的,不存在bug可以直接運行。

如果覺得本文還不錯,就請點個贊給作者一點鼓勵吧!如果有建議,也請評論指教和討論!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907354.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907354.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907354.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第三屆寧波技能大賽網絡安全賽項樣題

2025 第三屆寧波技能大賽網絡安全賽項樣題 模塊A: 網絡安全事件響應、數字取證調查和應用安全任務一:應急響應任務二:操作系統取證任務三:網絡數據包分析任務四:代碼審計 模塊B:CTF 奪旗-攻擊模塊C:CTF 奪旗-防御需要環境培訓可以私信博主&#xff01;&#xff01;&#xff01;…

GO語言進階:掌握進程OS操作與高效編碼數據轉換

&#x1f49d;&#x1f49d;&#x1f49d;歡迎蒞臨我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦&#xff1a;「storms…

IO進程(進程 Process)

什么是進程&#xff1f; 1.概念 程序&#xff1a;編譯好的可執行文件&#xff0c;存放在磁盤上的指令和數據的有序集合。 由此可見程序是靜態的&#xff0c;沒有執行的概念。 進程&#xff1a;是程序的一次執行的過程&#xff0c;是一個可調度的任務&#xff0c;也是執行一…

CSS傳統布局與定位詳解與TDK三大標簽SEO優化

一、傳統布局基礎 1. 文檔流布局 瀏覽器默認的文檔流布局方式遵循以下規則&#xff1a; 塊級元素&#xff08;如<div>、<p>、<h1>&#xff09;&#xff1a; 獨占一行寬度默認100%可以設置寬高、內外邊距 div {width: 500px;height: 200px;margin: 10px …

【GraphQL】深入解析 Apollo Client:從架構到實踐的一站式 GraphQL 解決方案

深入解析 Apollo Client&#xff1a;從架構到實踐的一站式 GraphQL 解決方案 1. 引言 GraphQL 作為現代 API 開發的核心技術&#xff0c;其靈活性和高效性正在重塑數據交互模式。Apollo Client 作為 GraphQL 生態中最受歡迎的客戶端庫&#xff0c;憑借強大的緩存機制、框架集…

docker學習基本使用教程

docker是一款用于開發部署和運行容器化平臺&#xff0c;能將應用及其依賴打包成輕量級、可移植的容器&#xff0c;實現一次構建&#xff0c;隨處運行。docker是cs架構程序&#xff08;客戶端和服務端&#xff09;&#xff0c;docker客戶端向docker守護進程發送請求&#xff0c;…

萬字詳解RTR RTSP SDP RTCP

目錄 1 RTSP1.1 RTSP基本簡介1.2 RSTP架構1.3 重點內容分析 2 RTR2.1 RTR簡介2.2 RTP 封裝 H.2642.3 RTP 解封裝 H.2642.4 RTP封裝 AAC2.5 RTP解封裝AAC 3 SDP3.1 基礎概念3.2 SDP協議示例解析3.3 重點知識 4 RTCP4.1 RTCP基礎概念4.2 重點 5 總結 1 RTSP 1.1 RTSP基本簡介 一…

唯一原生適配鴻蒙電腦的遠程控制應用,向日葵正式上線

近日&#xff0c;華為正式發布鴻蒙電腦新品&#xff0c;標志著HarmonyOS在PC端生態的進一步拓展。作為遠程控制領域的先行者&#xff0c;貝銳科技旗下的向日葵遠程控制軟件也在第一時間完成了對鴻蒙電腦系統的原生適配&#xff0c;并已正式上線華為鴻蒙電腦應用市場&#xff0c…

vue2中,codemirror編輯器的使用

交互說明 在編輯器中輸入{時&#xff0c;會自動彈出選項彈窗&#xff0c;然后可以選值插入。 代碼 父組件 <variable-editorv-model"content":variables"variables"placeholder"請輸入模板內容..."blur"handleBlur" />data…

Kafka自定義分區策略實戰避坑指南

文章目錄 概要代碼示例小結 概要 kafka生產者發送消息默認根據總分區數和設置的key計算哈希取余數&#xff0c;key不變就默認存放在一個分區&#xff0c;沒有key則隨機數分區&#xff0c;明顯默認的是最不好用的&#xff0c;那kafka也提供了一個輪詢分區策略&#xff0c;我自己…

WPF 全屏顯示實現(無標題欄按鈕 + 自定義退出按鈕)

WPF 全屏顯示實現&#xff08;無標題欄按鈕 自定義退出按鈕&#xff09; 完整實現代碼 MainWindow.xaml <Window x:Class"FullScreenApp.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas…

sqli_labs第二十九/三十/三十一關——hpp注入

一&#xff1a;HTTP參數污染&#xff1a; hpp&#xff08;http parameter pollution)注入中&#xff0c;可以通過在hppt的請求中注入多個同名參數來繞過安全過濾 原理&#xff1a;php默認只取最后一個同名參數 比如在這一關里&#xff0c;可能對第一個id參數進行消毒處理&a…

【STM32】按鍵控制LED 光敏傳感器控制蜂鳴器

&#x1f50e;【博主簡介】&#x1f50e; &#x1f3c5;CSDN博客專家 &#x1f3c5;2021年博客之星物聯網與嵌入式開發TOP5 &#x1f3c5;2022年博客之星物聯網與嵌入式開發TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;華為云開發…

華為OD機試真題——斗地主之順子(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

Qt找不到windows API報錯:error: LNK2019: 無法解析的外部符號 __imp_OpenClipboard

筆者在開發中出現的bug完整報錯如下&#xff1a; spcm_ostools_win.obj:-1: error: LNK2019: 無法解析的外部符號 __imp_OpenClipboard&#xff0c;函數 "void __cdecl spcmdrv::vCopyToClipboard(char const *,unsigned __int64)" (?vCopyToClipboardspcmdrvYAXPE…

4.8.4 利用Spark SQL實現分組排行榜

在本次實戰中&#xff0c;我們的目標是利用Spark SQL實現分組排行榜&#xff0c;特別是計算每個學生分數最高的前3個成績。任務的原始數據由一組學生成績組成&#xff0c;每個學生可能有多個成績記錄。我們首先將這些數據讀入Spark DataFrame&#xff0c;然后按學生姓名分組&am…

[PyMySQL]

掌握pymysql對數據庫實現增刪改查數據庫工具類封裝,數據庫操作應用場景數據庫操作應用場景 校驗測試數據 : 刪除員工 :構造測試數據 : 測試數據使用一次就失效,不能重復使用 : 添加員工(is_delete)測試數據在展開測試前無法確定是否存在 : 查詢,修改,刪除員工操作步驟:!~~~~~~~…

cs224w課程學習筆記-第12課

cs224w課程學習筆記-第12課 知識圖譜問答 前言一、問答類型分類二、路徑查詢(Path queries)2.1 直觀查詢方法2.2 TransE 擴展2.3 TransE 能力分析 三、連詞查詢(conjunctive queries)3.1 Query2box 原理1)、投影2)、交集查詢&#xff08;AND 操作)3)、聯合查詢&#xff08;OR 操…

AI任務相關解決方案2-基于WOA-CNN-BIGRU-Transformer模型解決光纖通信中的非線性問題

文章目錄 1. 項目背景與研究意義1.1 光纖通信中的非線性問題1.2 神經網絡在光纖非線性補償中的應用現狀 2. 現有模型 CNN-BIGRU-attention 分析2.1 模型架構與工作原理2.2 模型性能評估與局限性 3. 新模型優化方案3.1 WOA算法原理與優勢3.2 WOA-CNN-BIGRU-MHA模型構建3.3 WOA-C…

HTTP Accept簡介

一、HTTP Accept是什么 HTTP協議是一個客戶端和服務器之間進行通信的標準協議&#xff0c;它定義了發送請求和響應的格式。而HTTP Accept是HTTP協議中的一個HTTP頭部&#xff0c;用于告訴服務器請求方所期望的響應格式。這些格式可以是媒體類型、字符集、語言等信息。 HTTP A…