文章首发:
行为型模式:解释器模式
十一大行为型模式之十:解释器模式。
简介
姓名 :解释器模式
英文名 :Interpreter Pattern
价值观 :不懂解释到你懂
个人介绍 :
Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.
给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。
(来自《设计模式之禅》)
你要的故事
解释器顾名思义就是对 2 个不同的表达方式进行转换,让本来不懂的内容解释成看得懂的。比如翻译官就是解释器,把英文翻译成中文,让我们明白外国人说什么。咱们工作中也有很多类似的场景,开发系统避免不了使用数据库,数据库有特定的语法,我们称为 SQL (Structured Query Language),而我们系统开发语言和 SQL 的语法不一样,这中间就需要做一层转换,像把 Java 语言中的 userDao.save(user)
变成 insert into user (name,age) values ('小明', 18)
,这一层转换也可以称为解释器。很多框架实现了这个功能,比如 Hibernate,我们称这些框架为 ORM
。
今天,我们就来简单的实现 SQL 拼接解释器,通过参数组装成我们要的 SQL 语句。好多开发同学都吐槽工作天天在 CRUD,也就是只干增删改查的活,对于 SQL 我们经常用的也就是这 4 种语法:insert 语句、delete 语句、update 语句、select 语句。这 4 种语法各有不同,也即需要不同的解释器去解析。利用今天要讲的解释器模式,我们来实现一番。
解释器模式中,会有一个上下文类,这个类用于给解释器传递参数。这里我们 SQL 解释器需要的参数分别是
- tableName :数据库名
- params :修改时更新后的数据
- wheres :where 语句后的条件
1 | class Context { |
解释器主角来了,定义 SQL 解释器抽象类,它有一个抽象方法 interpret,通过这个方法来把 context 中的参数解释成对应的 SQL 语句。
1 | /** |
我们上面说了 SQL 语句用的比较多的就是 4 种,每一种其实就是一个解释器,因为语法不一样,解释的逻辑也就不一样,我们就利用 SQLExpression
解释器抽象类,来实现 4 个具体的 SQL 解释器,分别如下:
Insert SQL 解释器代码实现:
1 | /** |
Update SQL 解释器代码实现:
1 | /** |
Select SQL 解释器代码实现:
1 | /** |
Delete SQL 解释器代码实现
1 | /** |
测试代码
1 | public class InterpreterTest { |
上面实现了整个解释器模式的代码,其实咱们在开发中,SQL 解析没有这么去实现,更多是用一个工具类把上面的各个 SQL 解释器的逻辑代码分别实现在不同方法中,如下代码所示。因为咱们可以预见的就这 4 种语法类型,基本上不用什么扩展,用一个工具类就足够了。
1 | class SQLUtil { |
总结
上面用解释器模式实现了 SQL 解释器,然后又指明了实际上咱们开发中大多数是直接一个 SQLUtil 工具类就搞定,并不是说解释器模式没用,想表达的观点是:解释器在工作中很少使用,工作中我们一般遵循的是能用就好策略,满足当前需求,加上一些易扩展性就足够了。解释器模式有比较大的扩展性,就如上面,再加上个建表语句 create table
只需要加一个 CreateTableSQLExpression
就可以轻松实现,不用去改动其他解释器代码。今天的解释器就到讲到这。觉得不错点个“在看”鼓励鼓励一下。
推荐阅读
设计模式系列文章持续更新中,欢迎关注公众号 LieBrother,一起交流学习。