简介
解释器模式,简单来说就是一种翻译机,将我们听到的英文翻译成中文。
那么这和我们之前提到的适配器模式有什么不同呢?
下面我们来对比一下二者的区别
正文
首先,我先从以前的文章从贴过来一段适配器模式的代码实现
class ProductA:
def type_c(self):
print("这是一个type-c输出")
class ProductB(ProjectA):
def type_c(self):
print("经过转换,变成一个type-b输出")
接下来我实现一个简单的翻译器模式
class Interpreter:
def __init__(self):
self.dictionaries = {
"a":1,
"b":2,
"c":3,
"d":4,
}
def translation(self,str_list):
return "".join([self.dictionaries[s] for s in str_list if s in self.dictionaries])
i = Interpreter()
i.translation("abbdcbaab)
对比之下我们可以很容易的看出二者的区别,适配器模式是直接将原有的行为进行了替换或者修改,而翻译器则是创造一种全新的方式,将我们输入的语言转化从另一种语言输出,本质上改动的输入内容的结构,而不是改动函数的结构。
同时经过一些网上的搜索,大多数都是认为解释器模式只有在设计编译器的时候会被用到,但是个人觉得序列化器和筛选器都应用到了翻译器模式。
前者是将对象与json字符串之间做转化,后者则是将json字符串和SQL语句相互转化。下面我们简单实现一下两者。
首先是序列化器
from collections import defaultdict
class Interpreter:
def __init__(self,obj) -> None:
self.obj = obj
def translation_dict(self):
temp_dict = defaultdict(str)
for o in dir(self.obj):
if hasattr(self.obj, o):
temp_dict[o] = getattr(self.obj,o)
return temp_dict
class Test:
name = "test"
value = "my_test"
def test(self):
print("这是一个测试")
i = Interpreter(Test())
print(i.translation_dict())
这是一个十分粗糙的序列化器,将对象的所有属性都封装到字典中,并且还不支持从字典转回对象。 但是也完成了解释器最核心的功能,将输入的数据类型转化成另外一种类型,这时我又突然想到强制转换应该也是运用了解释器的设计模式
接下来是筛选器
class InterpreterJSON:
def __init__(self,var) -> None:
self.var = var
def translation(self):
return " and ".join([key+"="+value for key, value in self.var.items()])
i = InterpreterJSON({"test1":"111","test2":"222",})
print(i.translation())
这个筛选器也十分的简陋,只是将json翻译成了一段SQL的筛选条件。
总结
通过上述两个小例子,我们大致知道了翻译器模式的用途,以及我们可以使用的应用场景,如果有什么写的不对的地方,欢迎大家指出