設計模式-解釋器模式

作者持續關注 WPS二次開發專題系列,持續為大家帶來更多有價值的WPS開發技術細節,如果能夠幫助到您,請幫忙來個一鍵三連,更多問題請聯系我(QQ:250325397)

定義

解釋器模式(Interpreter Pattern)提供了評估語言的語法或表達式的方式,它屬于行為型模式。這種模式實現了一個表達式接口,該接口解釋一個特定的上下文。這種模式被用在 SQL 解析、符號處理引擎等。

特點

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

使用場景

編譯器、運算表達式計算。

優缺點

(1) 優點
    • 可擴展性比較好,靈活。
    • 增加了新的解釋表達式的方式。
    • 易于實現簡單文法。
(2) 缺點
    • 可利用場景比較少。
    • 對于復雜的文法比較難維護。
    • 解釋器模式會引起類膨脹。
    • 解釋器模式采用遞歸調用方法。

模式結構

    • 定義一個抽象表達式(Expression)接口,它包含了解釋方法 interpret(String info)。
    • 定義一個終結符表達式(Terminal Expression)類,它用集合(Set)類來保存滿足條件的城市或人,并實現抽象表達式接口中的解釋方法 interpret(Stringinfo),用來判斷被分析的字符串是否是集合中的終結符。
    • 定義一個非終結符表達式(AndExpressicm)類,它也是抽象表達式的子類,它包含滿足條件的城市的終結符表達式對象和滿足條件的人員的終結符表達式對象,并實現 interpret(String info) 方法,用來判斷被分析的字符串是否是滿足條件的城市中的滿足條件的人員。
    • 最后,定義一個環境(Context)類,它包含解釋器需要的數據,完成對終結符表達式的初始化,并定義一個方法 freeRide(String info) 調用表達式對象的解釋方法來對被分析的字符串進行解釋。

具體實現

接口和實現

/*** 抽象表達式類*/
interface Expression {/*** 解釋*/boolean interpret(String info);
}/*** 非終結符表達式類*/
class AndExpression implements Expression {private Expression city = null;private Expression person = null;public AndExpression(Expression city, Expression person) {this.city = city;this.person = person;}public boolean interpret(String info) {String s[] = info.split("的");return city.interpret(s[0]) && person.interpret(s[1]);}
}/*** 終結符表達式類*/
class TerminalExpression implements Expression {private Set<String> set = new HashSet<>();public TerminalExpression(String[] data) {set.addAll(Arrays.asList(data));}public boolean interpret(String info) {if (set.contains(info)) {return true;}return false;}
}

環境類

/*** 環境類*/
class Context {private String[] cities = {"武漢"};private String[] persons = {"老人", "婦女", "兒童"};private Expression cityPerson;public Context() {Expression city = new TerminalExpression(cities);Expression person = new TerminalExpression(persons);cityPerson = new AndExpression(city, person);}public void freeRide(String info) {boolean ok = cityPerson.interpret(info);if (ok) System.out.println("您是" + info + ",您本次乘車免費!");else System.out.println(info + ",您不是免費人員,本次乘車扣費2元!");}
}

具體使用

/*** 狀態模式* 介紹鏈接:https://www.kdocs.cn/l/ct3ki9na5JMo<pre>文法規則<expression> ::= <city>的<person><city> ::= 武漢<person> ::= 老人|婦女|兒童</pre>
*/
public class App {public static void main(String[] args) {Context bus = new Context();bus.freeRide("武漢的老人");bus.freeRide("武漢的年輕人");bus.freeRide("深圳的婦女");bus.freeRide("深圳的兒童");}
}

實際應用

  1. 存款利息計算(設置好計算規則)

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

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

相關文章

vue3 組件刷新

在 Vue 3 中&#xff0c;如果你想刷新一個組件&#xff0c;有幾種方法可以實現。 使用 key 屬性: 當你想要強制重新渲染一個組件時&#xff0c;你可以為其添加一個獨特的 key 屬性。當 key 屬性的值改變時&#xff0c;Vue 會強制組件重新創建。 <template> <MyComp…

jQuery 中的toggleClass應用 (含代碼)

直接上代碼 <!DOCTYPE html> <html><head><style>.info {color: green;}</style></head><body><input type"button" value"點擊" onclick"changeClass()" /><div id"x1">例子…

第十五屆藍橋杯國賽前的問題記錄

文章目錄 遇到的問題問題解析1.生成m-n的隨機數&#xff0c;包括倆個數在內2.fetch解析后如何獲取結果3.獲取多選下拉框&#xff08;select標簽設置multiple屬性&#xff09;的值4.如何刪除某個獲取到的節點5.vue中遇到多選下拉框如何處理 小結 遇到的問題 生成m-n的隨機數fet…

(delphi11最新學習資料) Object Pascal 學習筆記---第12章第3節 ( RTL 中的類引用 )

12.3.1 RTL 中的類引用** ? System 單元和其他核心 RTL 單元聲明了許多類引用&#xff0c;包括以下幾種&#xff1a; TClass class of TObject; ExceptClass class of Exception; TComponentClass class of TComponent; TControlClass class of TControl; TFormClass c…

Nginx企業級負載均衡:技術詳解系列(9)—— Nginx核心配置詳解(全局配置)

你好&#xff0c;我是趙興晨&#xff0c;97年文科程序員。????? 在 Nginx企業級負載均衡&#xff1a;技術詳解系列&#xff08;8&#xff09;—— Nginx核心配置詳解&#xff08;默認配置文件&#xff09;文章中&#xff0c;咱們討論了Nginx核心配置文件的基礎知識&#…

【Python設計模式11】建造者模式

建造者模式&#xff08;Builder Pattern&#xff09;是一種創建型設計模式&#xff0c;它將一個復雜對象的構建過程分離出來&#xff0c;使得同樣的構建過程可以創建不同的表示。建造者模式通過使用多個簡單的對象一步一步構建成一個復雜的對象。 建造者模式的結構 建造者模式…

centos9 stream在線安裝NVIDIA驅動(rockylinux9.4也成功安裝nvidia驅動)

Install NVIDIA Drivers on CentOS Stream 9&#xff08;rockylinux9.4成功&#xff09; 主板為技嘉mz72-hb2 顯卡為4090 一.Disable Secure Boot From the BIOS 二.Enabling the EPEL Repository on CentOS Stream 9 1.update the DNF package repository cache sudo dnf …

STM32控制HC-SR04超聲模塊獲取距離

歡迎入群共同學習交流 時間記錄&#xff1a;2024/5/23 一、模塊介紹 &#xff08;1&#xff09;引腳介紹 VCC&#xff1a;電源引腳&#xff0c;接單片機3.3/5V GND&#xff1a;電源地 Trig&#xff1a;超聲信號觸發引腳 Echo&#xff1a;超聲信號接收引腳 &#xff08;2&…

java.util.Arrays 詳解

排序 sort(int[] a): 對指定 int 型數組按數字升序進行排序。sort(Object[] a): 對指定對象數組進行排序&#xff08;對象的類必須實現 Comparable 接口&#xff09;。sort(T[] a, Comparator<? super T> c): 使用指定的比較器對數組進行排序。sort(int[] a, int fromI…

給你一把接口響應斷言神器,你要不要?

JSON Schema是用來標記和校驗JSON數據&#xff0c;類似于XMLSchema,可用在自動化測試驗證JSON數據。 官網&#xff1a;http://json-schema.org/ 最常用版本&#xff1a;draft 04。&#xff08;目前各類編程語言對draft 04支持最廣泛&#xff09; 舉個例子 假如你有一個接口…

202473讀書筆記|《但愿呼我的名為旅人:松尾芭蕉俳句300》——圍爐夜話,身頓心安,愿每個人都能在愛里自由馳騁

202473讀書筆記|《但愿呼我的名為旅人&#xff1a;松尾芭蕉俳句300》——圍爐夜話&#xff0c;身頓心安&#xff0c;愿每個人都能在愛里自由馳騁 &#x1f60d;&#x1f60d;&#x1f929;&#x1f929; 譯者序正文二正文三正文四正文五正文六正文七 《但愿呼我的名為旅人&…

Lua中table.sort()使用方式

table.sort(tab,compare) 參數如下&#xff1a; tab:表名 compare:比較規則函數名 簡略寫法&#xff1a; a {1,2,3} table.sort(a,function(a,b) return a>b end) compare這個參數是一個函數&#xff0c;它有兩個參數&#xff0c;你可以理解為表中的兩個不同元素&…

智能進化:讓AI大模型變得更聰明的路徑探索

前言 隨著人工智能&#xff08;AI&#xff09;技術的飛速發展&#xff0c;大模型在多個領域展現出了前所未有的能力。然而&#xff0c;它們仍然面臨著理解力、泛化能力和適應性等方面的挑戰。如何讓大模型變得更聰明&#xff0c;是當前AI研究和應用的一個重要課題。本文將探討…

解除網頁禁止選擇

控制臺輸入以下命令 復制&#xff1a;javascript:void(document.body.οncοpy) 可選&#xff1a;javascript:void(document.body.onselectstart) 拖拉&#xff1a;javascript:void(document.body.οnmοuseup)

C++實現基于http協議的epoll非阻塞模型的web服務器框架(支持訪問服務器目錄下文件的解析)

使用方法&#xff1a; 編譯 例子&#xff1a;./httpserver 9999 ../ htmltest/ 可執行文件 端口 要訪問的目錄下的 例子&#xff1a;http://192.168.88.130:9999/luffy.html 前提概要 http協議 &#xff1a;應用層協議&#xff0c;用于網絡通信&#xff0c;封裝要傳輸的數據&…

npm install [Error]

npm install 依賴的時候報錯 依賴版本問題的沖突&#xff0c;忽視即可 使用 npm install --legacy-peer-deps

剪畫小程序:3個分離人聲提取小技巧,趕緊收藏起來吧!

Hello&#xff01;大家好呀&#xff01;這里是社會主義搬磚人小畫&#xff01; 人聲分離&#xff0c;是指將混合在一起的人聲和其他聲音&#xff08;如背景音樂、環境噪音等&#xff09;分離開來&#xff0c;提取出單獨的人聲部分的過程。 在實際應用中&#xff0c;人聲分離技…

leetcode654.最大二叉樹、617.合并二叉樹、700.二叉搜索樹中的搜索

654.最大二叉樹 構造樹一般采用的是前序遍歷&#xff0c;因為先構造中間節點&#xff0c;然后遞歸構造左子樹和右子樹 確定遞歸函數的參數和返回值 參數傳入的是存放元素的數組&#xff0c;返回該數組構造的二叉樹的頭結點&#xff0c;返回類型是指向節點的指針。 TreeNode…

Unity 開發Hololens,制作面板跟隨眼鏡一起移動,(面板跟蹤)

Hololens滑動框以及面板跟蹤 創建空物體&#xff0c;并添加組件 SolverHandler、RedialView、FollowMeToggle 創建按鈕&#xff0c;控制停止/開始跟蹤 創建一個Hololens自帶的按鈕放到右上角&#xff0c;并添加事件 創建藍色背景板 創建空物體Backplate&#xff0c;下面再…

個體因果效應估計|EDVAE:用于個體治療效果估計的反事實推理中的解開潛在因素模型

【摘要】根據觀察數據估計個體治療效果&#xff08;ITE&#xff09;是一項至關重要但具有挑戰性的任務。解纏結表示已用于將代理變量分為混雜變量、工具變量和調整變量。然而&#xff0c;根據觀測數據準確地進行反事實推理來識別 ITE 仍然是一個懸而未決的問題。在本文中&#…