0
点赞
收藏
分享

微信扫一扫

Python 进阶 — 设计模式


目录


文章目录


  • ​​目录​​
  • ​​设计模式的原则​​
  • ​​Interface 模式​​
  • ​​Adapter 模式​​
  • ​​单例模式​​
  • ​​Visitor 模式​​


设计模式的原则


  1. 面向接口编程,而不是面向实现编程。
  2. 优先使用组合而不是继承。

Interface 模式

Python 支持 Duck Typing(鸭子类型)的实现,本质上就是支持面向接口的设计模式。

class Duck:
def fly(self):
print("Duck flying")

class Airplane:
def fly(self):
print("Airplane flying")

def lift_off(entity):
entity.fly()

duck = Duck()
plane = Airplane()

lift_off(duck)
lift_off(plane)

Adapter 模式

假设已经实现了 “日志内容的文件写入功能”,现在希望将该功能扩展为将 “日志内容的数据库写入功能”,此时就可以使用 Adapter(适配器)模式,通过实现 db.write 来适配 file.write。

def log(file, msg):
file.write('[{}] - {}'.format(datetime.now(), msg))

class DBAdapter:
def __init__(self, db):
self.db = db

def write(self, msg):
self.db.insert(msg)

db_adapter = DBAdapter(db)
log(db_adapter, "sev1 error occurred")

可见,只要采用 Adapter 模式,实现了 write 方法,那么不管你是任何对象,都可以进行适配。也算是比较典型的 Duck Typing。但是这种方法的弊端就是,不知道 log 方法的参数类型,想要重构可就难了。

单例模式

单例模式(Singleton Pattern)的实现需要依赖于编程语言对类构造器的隐藏或销毁。

Python 没有提供类似 Java private 关键字的类构造器隐藏机制,但是 Python 可以依靠 Module 机制来实现类构造器的销毁。

#singleton.py

class Singleton:
def __init__(self):
self.name = "i'm singleton"

instance = Singleton()

del Singleton # 把构造函数删除

使用 Singleton:

import singleton

print(singleton.instance.name) # i'm singleton

instance = Singleton() # NameError: name 'Singleton' is not defined

Visitor 模式

Visitor 模式的本质是将数据结构和数据操作进行分离。通过 Python 的 Generator 可以优雅地实现。

class TreeNode:

def __iter__(self):
return self.__generator()

def __generator(self):
if self.left is not None:
yield from iter(self.left)
yield from self.data

if self.right is not None:
yield from iter(self.right)

root = TreeNode('1')
root.left = TreeNode('2')
root.right = TreeNode('3')

for ele in root:
print(ele)



举报

相关推荐

0 条评论