文中给了一个案例
class FancyLogger:
"""日志类:支持向文件、Redis 、ES 等服务输出日志"""
_redis_max_length = 1024
def __init__(self, output_type=OutputType.FILE):
self.output_type = output_type
...
def log(self, message):
"""打印日志"""
if self.output_type == OutputType.FILE:
...
elif self.output_type == OutputType.REDIS:
...
elif self.output_type == OutputType.ES:
...
else:
raise TypeError('output type invalid')
def pre_process(self, message):
"""预处理日志"""
# Redis 对日志最大长度有限制,需要进行裁剪
if self.output_type == OutputType.REDIS:
return message[:self._redis_max_length]
FancyLogger 类在日志输出类型不同时,需要有不同的行为。因此,我们完全可以为“输出日志”行为建模一个新的类型:LogWriter ,然后把每个类型的不同逻辑封装到各自的 Writer 类中。
class FileWriter:
def write(self, message):
...
class RedisWriter:
max_length = 1024
def write(self, message):
message = self._pre_process(message)
...
def _pre_process(self, message):
"""Redis 对日志最大长度有限制,需要进行裁剪"""
return message[:self.max_length]
class EsWriter:
def write(self, message):
...
基于这些不同的 Writer 类,FancyLogger 可以简化成下面这样:
class FancyLogger:
"""日志类:支持向文件、Redis 、ES 等服务输出日志"""
def __init__(self, output_writer=None):
self._writer = output_writer or FileWriter()
...
def log(self, message):
self._writer.write(message)
文中对这样的写法好处解释为
代码利用多态特性,完全消除了原来的条件判断语句。另外你会发现,新代码的扩展性也远比旧代码好。
但是在我看来, 你要传什么 output_writer 不还是要通过 if 来选择吗, 只是把一个地方的 if 换到了另外一个地方,
扩展性 这个模块看起来确实好了, 但是总感觉和上面一样, 这里提高了, 但是其他地方就要更多 if, TVT, 面向对象还是没有入门
|