外观模式(Facade)

在复杂系统中,一个功能往往需要调用多个子系统:数据库缓存消息队列日志系统权限系统如果客户端直接调用这些子系统,就会出现:调用顺序复杂强耦合代码难维护这时就需要一个统一入口。这就是外观模式(Facade)。一、外观模式解决什么问题?一句话:为复杂子系统提供一个统一的简化接口。关键词:简化接口隐藏复杂性解耦客户端与子系统二、一个真实业务场景假设我们有一个电商”下单流程”。一个订单涉及:库存系统支付系统...

装饰器模式(Decorator)

在开发中,你是否遇到过这样的需求:给函数增加日志给接口增加权限校验给方法增加缓存给对象增加额外功能但你又不想:修改原有类破坏原有逻辑使用大量继承这时候就轮到——装饰器模式。一、装饰器模式解决什么问题?一句话:在不修改原对象结构的情况下,动态地给对象增加额外功能。关键词:动态增强不修改原类不使用继承扩展二、一个不用装饰器的”笨办法”假设有一个通知类:classNotifier:defsend(sel...

组合模式(Composite)

在业务系统中,有一种结构非常常见:组织架构文件系统菜单系统权限树评论树商品分类它们都有一个共同点:整体和部分具有一致的结构。这正是组合模式要解决的问题。一、组合模式解决什么问题?一句话:将对象组合成树形结构以表示”部分-整体”的层次结构,使客户端对单个对象和组合对象的使用具有一致性。关键词:树结构递归统一接口单个对象和组合对象一致处理二、一个典型场景:公司组织架构假设我们要表示:总公司├──技术部...

桥接模式(Bridge)

在讲桥接模式之前,先问一个问题:如果一个类有两个变化维度,你会怎么设计?很多人第一反应是——继承。但当继承层级开始”爆炸”时,桥接模式就该登场了。一、桥接模式解决什么问题?一句话:将抽象部分与实现部分分离,使它们可以独立变化。关键词:抽象(Abstraction)实现(Implementation)解耦组合替代继承二、一个典型的继承爆炸问题假设我们要设计一个”消息通知系统”。消息类型有:普通消息紧...

适配器模式(Adapter)

一、适配器模式解决什么问题?一句话:接口不兼容,但你又不能改原有代码。现实世界类比:国标插头插不进英标插座需要一个转换头软件世界中:老系统接口不能改第三方库接口格式不一致新旧系统并存这时就需要——适配器(Adapter)。二、定义将一个类的接口转换成客户端期望的另一个接口,使原本由于接口不兼容而不能一起工作的类可以一起工作。核心关键词:接口转换不修改原类让旧代码继续工作三、一个真实业务场景假设你原...

对象池模式(Object Pool)

在前几篇中,我们讨论的都是:如何创建对象如何复制对象如何构建复杂对象而对象池模式关注的是一个更现实的问题:对象创建太贵了,能不能不要频繁创建?这就是ObjectPool(对象池)存在的意义。一、什么是对象池模式?一句话定义:对象池模式通过维护一组可复用对象,避免频繁创建和销毁,从而提升性能。核心思想:预先创建一批对象使用时从池中取出用完后归还池中不重复创建二、什么时候需要对象池?对象池并不是”通用...

原型模式(Prototype)

在前面的几种创建型模式中(工厂、抽象工厂、建造者),我们解决的核心问题都是:“对象该怎么创建?”而原型模式关注的是另一件事:“对象已经很复杂了,能不能直接复制一个?”这就是Prototype(原型)模式要解决的问题。一、原型模式要解决什么问题?原型模式的核心思想一句话就够了:通过复制已有对象来创建新对象,而不是通过new或构造函数。它适合解决这类场景:对象创建成本很高(初始化复杂、耗时)对象结构复...

建造者模式(Builder)

在前面几篇中,我们讨论的都是”创建哪一个对象”。但在实际开发中,你还会遇到另一类问题:对象是同一个,但构建过程非常复杂。这正是建造者模式要解决的核心场景。一、什么时候需要建造者模式先看一个常见例子:创建一个请求对象。request=HttpRequest(url="https://api.example.com",method=...

抽象工厂模式(Abstract Factory)

在上一篇中,我们用工厂方法模式解决了“如何创建某一种对象”的问题。但在真实项目中,你很快会遇到更复杂的情况:不是创建一个对象,而是创建“一整套相关对象”。这正是抽象工厂模式存在的原因。一、什么时候工厂方法不够用先看一个典型业务场景:系统需要支持多种支付渠道每种支付渠道,都包含:支付接口对账接口退款接口也就是说:对象之间存在“成组出现”的关系。如果仍然使用工厂方法:pay=PaymentF...

工厂方法模式(Factory Method)

在真实项目中,对象的创建往往比使用更复杂。如果你发现代码中频繁出现if-else或根据参数去new不同的类,那基本已经到了该用工厂方法模式的时候了。一、工厂方法模式解决什么问题先看一个非常常见的写法:defcreate_payment(pay_type):ifpay_type=="wechat":returnWeChatPay()elifpay_type&#...