社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python常用的6个设计模式,效率直接翻倍!(下)

AirPython • 1 周前 • 34 次点击  

 


在上一篇文章里,我们讲解了 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 项目里的大部分场景了。

设计模式其实就像工具箱,多写多使用,熟能生巧,不建议大家死记硬背!

 

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/186050
 
34 次点击