在上一篇文章里,我们讲解了 Python 中最常用 6 种设计模式: 单例模式、工厂模式、装饰器模式、观察者模式、策略模式、适配器模式。
Python常用的6个设计模式,效率直接翻倍!
本篇文章将继续聊聊另外 6 种常用的设计模式。
1-代理模式
你不直接操作某个对象,而是通过“代理”间接操作。就好像明星本人不接电话,你得先找经纪人。
使用场景:需要对原对象增加权限控制、延迟加载(比如:远程调用、图片加载等)
class RealImage:
def__init__(self, filename):
self.filename = filename
self.load_from_disk()
defload_from_disk(self):
print(f"从硬盘加载 {self.filename}")
defdisplay(self):
print(f"显示 {self.filename}"
)
classProxyImage:
def__init__(self, filename):
self.filename = filename
self.real_image = None
defdisplay(self):
ifself.real_image isNone:
self.real_image = RealImage(self.filename)
self.real_image.display()
# 使用
img = ProxyImage("girl.png")
img.display() # 第一次会加载
img.display() # 第二次直接用缓存
2-外观模式
对外只提供一个统一的接口,把内部复杂的逻辑都封装好。就像你点外卖,只管下单,配送、做饭、结算都不用你操心。
使用场景:简化复杂系统的调用,给其他用户提供一个“简易化的入口”
class CPU:
defstart(self):
print("CPU 启动")
classMemory:
defload(self):
print(
"内存加载数据")
classDisk:
defread(self):
print("硬盘读取数据")
classComputer:
def__init__(self):
self.cpu = CPU()
self.memory = Memory()
self.disk = Disk()
defstart(self):
self.cpu.start()
self.memory.load()
self.disk.read()
print("电脑启动完成!")
# 使用
pc = Computer()
pc.start()
3-建造者模式
一步步“组装”对象,最终得到一个复杂的产品。就像点套餐,你可以先选主食,再选饮料、配菜,最后组合成完整的一份。
使用场景: 将复杂对象的构建分成多个步骤生成
class Burger:
def__init__(self):
self.size = None
self.topping = []
class
BurgerBuilder:
def__init__(self):
self.burger = Burger()
defset_size(self, size):
self.burger.size = size
returnself
defadd_topping(self, topping):
self.burger.topping.append(topping)
returnself
defbuild(self):
returnself.burger
# 使用
builder = BurgerBuilder()
burger = builder.set_size("辣").add_topping("麻辣").add_topping("火锅").build()
print(burger.size, burger.topping)
4-原型模式
通过“克隆”已有对象,重新创建一个新对象,而不是重新 new 一个。比较适合那种 “生产成本高” 的对象。
使用场景:对象创建代价大(比如初始化很复杂),希望复制对象而不是重新构造
import copy
classResume:
def__init__(self, name, skills):
self.name = name
self.skills = skills
def__str__(self):
returnf"{self.name} 技能: {self.skills}"
# 使用原型模式
resume1 = Resume("小明", ["Python", "爬虫"])
resume2 = copy.deepcopy(resume1)
resume2.name = "小红"
resume2.skills.append("机器学习")
print(resume1) # 小明 技能: ['Python', '爬虫']
print(resume2) # 小红 技能: ['Python', '爬虫', '机器学习']
5-状态模式
对象在不同状态下,表现出的行为完全不同。就像手机的“静音模式”和“响铃模式”,来电话时反应就不一样。
使用场景:对象的行为依赖状态,避免代码中包含一堆 if-else
class State:
defhandle(self):
pass
classSilentState(State):
defhandle(self):
print("手机静音,来电不响了")
classRingState(State):
defhandle(
self):
print("手机响铃了!")
classPhone:
def__init__(self):
self.state = SilentState()
defset_state(self, state):
self.state = state
defincoming_call(self):
self.state.handle()
# 使用
phone = Phone()
phone.incoming_call()
phone.set_state(RingState())
phone.incoming_call()
6-模板方法模式
首先在在父类中定义一个“算法框架”,具体的步骤交给子类去实现。就像写好一份“论文模板”,正文部分让学生自己去填。
使用场景: 多个子类有相同逻辑,只是某些步骤不一样;固定流程,部分自定义
class AbstractGame:
def play(self):
self.start()
self.playing()
self.end()
def start(self):
print("游戏开始")
def end(self):
print("游戏结束")
def playing(self):
raise NotImplementedError
class LOLGame(AbstractGame):
def playing(self):
print("正在玩魔兽世界")
class DNFGame(AbstractGame):
def playing(self):
print("正在斗地主")
# 使用
game1 = LOLGame()
game1.play()
game2 = DNFGame()
game2.play()
7-总结
这篇文章我们聊了 代理模式、外观模式、建造者模式、原型模式、状态模式、模板方法模式。
如果你把这 12 种设计模式都搞明白,基本上就能应付日常 Python 项目里的大部分场景了。
设计模式其实就像工具箱,多写多使用,熟能生巧,不建议大家死记硬背!