23種設計模式(14) 直譯器模式

2021-07-12 06:54:58 字數 2597 閱讀 3231

在銀行、**類專案中,經常會有一些模型運算,通過對現有資料的統計、分析而**不可知或未來可能發生的商業行為。模型運算大部分是針對海量資料的,例如建立乙個模型公式,分析乙個城市的消費傾向,進而影響銀行的營銷和業務擴張方向,一般的模型運算都有乙個或多個運算公式,通常是加減乘除四則運算,偶爾也有指數、開方等複雜運算。具體到乙個金融業務中,模型公式是非常複雜的,雖然只有加減乘除四則運算,但是公式有可能有十多個引數,而且上百個業務品各有不同的取參路徑,同時相關表的資料量都在百萬級,呵呵,複雜了吧,不複雜那就不叫金融業務,我們就來講講運算的核心——模型公式,如何實現。

業務需求:輸入乙個模型公式(加減四則運算),然後輸入模型中的引數,運算出結果。

設計要求:

•公式可以執行期編輯,並且符合正常算術書寫方式,例如a+b-c;

•高擴充套件性,未來增加指數、開方、極限、求導等運算符號時,較少改動量;

•效率可以不用考慮,晚間批量運算。

需求不複雜,若僅僅對數字採用四則運算,每個程式設計師都可以寫出來。但是增加了增加模型公式就複雜了。先解釋一下為什麼需要公式, 而不採用直接計算的方法,例如有如下3個公式:

•業務種類1的公式:a+b+c-d;

•業務種類2的公式:a+b+e-d;

•業務種類3的公式:a-f。

其中,a、b、c、d、e、f引數的值都可以取得,如果使用直接計算數值的方法需要為每個品種寫乙個演算法,目前僅僅是3個業務種類,那上百個品種呢?歇菜了吧!建立公式,然後通過公式運算才是王道。

我們以實現加減演算法(由於篇幅所限,乘除法的運算讀者可以自行擴充套件)的公式為例,講解如何解析乙個固定語法邏輯。由於使用語法解析的場景比較少,而且一些商業公司(比如sas、spss等統計分析軟體)都支援類似的規則運算,親自編寫語法解析的工作已經非常少,以下例程採用逐步分析方法,帶領大家了解這一實現過程。

我們來想,公式中有什麼?僅有兩類元素:運算元素和運算符號,運算元素就是指a、b、c等符號,需要具體賦值的物件,也叫做終結符號,為什麼叫終結符號呢?因為這些元素除了需要賦值外,不需要做任何處理,所有運算元素都對應乙個具體的業務引數,這是語法中最小的單元邏輯,不可再拆分;運算符號就是加減符號,需要我們編寫演算法進行處理,每個運算符號都要對應處理單元,否則公式無法執行,運算符號也叫做非終結符號。兩類元素的共同點是都要被解析,不同點是所有的運算元素具有相同的功能,可以用乙個類表示,而運算符號則是需要分別進行解釋,加法需要加法解析器,減法也需要減法解析器。

//從map中取之

public int interpreter(hashmapvar)

}

public class varexpression extends expression 

//從map中取之

public int interpreter(hashmapvar)

}

public abstract class symbolexpression extends expression 

}

public class addexpression extends symbolexpression 

//把左右兩個表示式運算的結果加起來

public int interpreter(hashmapvar)  }

**清單27-5 減法解析器

public class subexpression extends symbolexpression

//左右兩個表示式相減

public int interpreter(hashmapvar)

}

public class calculator 

}

public class client 

//獲得表示式

public static string getexpstr() throws ioexception

//獲得值對映

public static hashmapgetvalue(string exprstr) throws ioexception }

}return map; }

}

其中,getexpstr是從鍵盤事件中獲得的表示式,getvalue方法是從鍵盤事件中獲得表示式中的元素對映值,執行過程如下。

首先,要求輸入公式。

請輸入表示式:a+b-c

其次,要求輸入公式中的引數。

請輸入a的值:100

請輸入b的值:20

請輸入c的值:40

最後,執行出結果。

運算結果為:a+b-c=80

設計模式之23 直譯器模式

直譯器模式 interpreter 的目的就是使用乙個直譯器為使用者提供一門定義語言的語法表示的直譯器。然後通過直譯器來解釋語言中的句子。uml圖如下所示 這種模式實現了乙個表示式介面,該介面解釋乙個特定的上下文。通常被用在sql解析,符號處理引擎等。角色 1 抽象直譯器 abstractexpre...

23種設計模式 14 模板方法模式

第一種實現 抽象類 第一種實現 抽象類 public abstract class makefood public void pouroil public void waitoilhot 具體往鍋裡倒哪個菜,交給子類,子類必須實現 public abstract void pourfood publ...

23種設計模式 裝飾器模式

7.應用場景 8.現實案例 9.注意事項 某些情況,當乙個類已經存在,並且可以對外提供核心功能時,但是,某個時刻,希望對這個類進行功能增強 如 增加快取 通常情況,我們可以修改原來的類,並增加對應的增強功能即可 但是,這種方式違背了 開 閉 原則,需要修改原來的 而且不夠靈活,如果有某個時刻又不想使...