Python

在很多系统中,你会遇到这样的需求:把”操作”当成对象传递支持操作的撤销(Undo)支持操作队列/延迟执行支持日志记录与重放例如:编辑器的撤销/重做任务队列(异步执行)按钮点击绑定不同行为审批操作记录如果直接写函数调用:light.turn_on()light.turn_off()看起来简单,但问题是:操作无法记录无法撤销无法统一调度这时候就需要——命令模式(Command)。一、命令模式解决什么问题?一句话:将请求封装为对象,从而使你可以用不同的请求对客户进行参数化。关键词:请求封装解耦调用者与执行者支持撤销/重做支持队列二、核心角色命令模式包含四个角色:1️⃣Command(命令接口)定义执...
在很多业务系统中,你一定遇到过这种代码:defhandle(order):iforder.status=="created":...eliforder.status=="paid":...eliforder.status=="shipped":...eliforder.status=="completed":...刚开始还好,但随着业务发展:状态越来越多状态之间有流转规则每个状态逻辑越来越复杂代码会变成:巨型if/else地狱这正是状态...
在很多系统中,你会遇到这样的需求:数据变化了,要通知多个模块一个事件发生,需要触发多个动作状态更新后,界面自动刷新例如:订单状态变化→通知用户、更新库存、记录日志配置变更→通知多个服务刷新缓存前端数据变化→自动更新UI如果你这样写:defupdate():notify_user()update_stock()write_log()问题很快就会出现:每增加一个功能,就要改原函数模块之间强耦合代码越来越难维护这正是观察者模式(Observer)要解决的问题。一、观察者模式解决什么问题?一句话:定义对象之间的一对多依赖关系,当一个对象状态发生变化时,所有依赖它的对象都会自动收到通知。关键词:一对多事...
在开发中,你是否写过这样的代码:defprocess():step1()step2()step3()然后在另一个地方:defprocess_v2():step1()step2_new()step3()再后来:defprocess_v3():step1()step2_new()step3_new()你会发现:整体流程是固定的只有某些步骤会变化代码开始出现大量重复这正是模板方法模式(TemplateMethod)要解决的问题。一、模板方法模式解决什么问题?一句话:定义一个算法的骨架,将某些步骤延迟到子类中实现。关键词:固定流程可变步骤代码复用控制流程二、一个典型场景:数据处理流程假设我们要实现一个...
在开发中,你一定写过这样的代码:ifpay_type=="wechat":...elifpay_type=="alipay":...elifpay_type=="bank":...刚开始还好,但随着业务发展:分支越来越多逻辑越来越复杂修改一个分支可能影响其他逻辑这时候代码就会变得:难维护、难扩展、容易出错。这正是策略模式(Strategy)要解决的问题。一、策略模式解决什么问题?一句话:定义一系列算法(策略),将它们封装起来,并且可以互相替换。关键词:算法封装动态切换避免if...
在很多系统中,会存在这样的情况:对象数量非常多对象之间大量属性是相同的只有少量状态不同如果每个对象都完整创建,就会导致:内存占用巨大对象创建成本高系统性能下降这时候就可以使用享元模式(Flyweight)。一、享元模式解决什么问题?一句话:通过共享对象,减少内存使用。核心思想:把对象中可共享的部分提取出来多个对象共享同一份数据只把不同的部分作为外部状态关键词:对象共享内存优化内部状态外部状态二、一个典型场景:文本编辑器假设一个文档有100万字符。每个字符对象可能包含:字符内容字体字号颜色位置如果每个字符都是完整对象:1000000×字体信息×样式信息大量数据是重复的。例如:字符:"A...
在很多系统中,我们并不会直接访问某个对象,而是通过一个”中间层”来完成访问。例如:访问远程服务(RPC)数据库懒加载权限控制缓存代理日志记录客户端看起来是在访问对象本身,但实际上中间有一层”代理”。这就是代理模式(Proxy)。一、代理模式解决什么问题?一句话:为一个对象提供一个替身(代理),以控制对该对象的访问。关键词:控制访问延迟加载权限控制远程访问代理对象与真实对象实现相同接口,客户端并不知道自己访问的是代理还是原对象。二、一个典型场景:图片懒加载假设系统中需要加载图片,但图片文件很大:加载速度慢占用内存可能根本不会被使用如果直接创建对象:classRealImage:def__init...
在复杂系统中,一个功能往往需要调用多个子系统:数据库缓存消息队列日志系统权限系统如果客户端直接调用这些子系统,就会出现:调用顺序复杂强耦合代码难维护这时就需要一个统一入口。这就是外观模式(Facade)。一、外观模式解决什么问题?一句话:为复杂子系统提供一个统一的简化接口。关键词:简化接口隐藏复杂性解耦客户端与子系统二、一个真实业务场景假设我们有一个电商”下单流程”。一个订单涉及:库存系统支付系统物流系统通知系统如果客户端自己调用:inventory.check(product_id)payment.pay(user_id,amount)logistics.create_order(order...
在开发中,你是否遇到过这样的需求:给函数增加日志给接口增加权限校验给方法增加缓存给对象增加额外功能但你又不想:修改原有类破坏原有逻辑使用大量继承这时候就轮到——装饰器模式。一、装饰器模式解决什么问题?一句话:在不修改原对象结构的情况下,动态地给对象增加额外功能。关键词:动态增强不修改原类不使用继承扩展二、一个不用装饰器的”笨办法”假设有一个通知类:classNotifier:defsend(self,message):print(f"发送消息:{message}")现在要增加”日志功能”。很多人会直接修改:classNotifier:defsend(se...
在业务系统中,有一种结构非常常见:组织架构文件系统菜单系统权限树评论树商品分类它们都有一个共同点:整体和部分具有一致的结构。这正是组合模式要解决的问题。一、组合模式解决什么问题?一句话:将对象组合成树形结构以表示”部分-整体”的层次结构,使客户端对单个对象和组合对象的使用具有一致性。关键词:树结构递归统一接口单个对象和组合对象一致处理二、一个典型场景:公司组织架构假设我们要表示:总公司├──技术部│├──后端组│└──前端组└──财务部如果不用组合模式,可能会这样设计:DepartmentTeamEmployee然后写大量if/else来区分类型。问题是:上层逻辑不得不关心”这是部门还是团队?...