• 设计模式的二十三招式——以入门者角度说说设计模式


    设计模式总结


    1. 创造型 5

    工厂模式

    一种工厂生产一种产品。

    抽象工厂模式

    同一类别的产品,相同的一些属性提取到抽象工厂中,具体产品的工厂遵守抽象工厂协议(具备一些共性),那么就可以使用具体产品工厂创造个性化的产品。

    建造者模式:将一个复杂对象的构建与表示分离,使得构建过程可以创建不同的表示。

    指挥者(director)持有一个 builder 引用,客户端调用指挥者的“切换 builder”方法后,调用指挥者的 make 方法来建造产品。不同的具体 builder 类最终可以 getResult 得到不同的产品。

    客户端调用的过程为:为指挥者设定 builer, 通过指挥者调用 builder 的各个方法, getResult 获得产品。

    适用于:构造函数有多参数,可以使用建造者模式灵活地创建对象。

    建造者模式和工厂模式的区别是什么?建造者模式是为了灵活创建有不同构成的对象,而工厂模式是什么样的工厂只生产什么样的产品。

    建造者模式和装饰器模式的区别是什么?

    建造者模式和策略模式的区别是什么?

    建造者模式和状态模式的区别是什么?

    单例模式

    在当前程序中,当前类只生成一个对象,这个对象称为单例。(单例对象生成线程不安全,在多线程环境中需要加锁)

    原型模式

    设定一个 ”原型“ 协议具有 clone 方法,原始父类实现了 “原型”协议,clone 方法(传入原始父类引用,返回一个原始父类对象对象),这样可以保证深复制且子类不与父类耦合(只是依赖 “原型” 协议)。

    2. 结构型 8

    适配器模式

    为了让 A 兼容 B,适配器继承 B,并且持有 A 的引用。这样适配器就可当作 B 来调用,也可以发挥 A 的功能。外部代码调用 B 执行功能,通过适配器转换为对 A 的调用。

    桥接模式

    将一个类拆分为“抽象” A 和“实现” B 两部分。A中持有 B 的引用,负责调用B来实现一些功能,B 负责把功能实现好。实际注入给 A 的 B 引用可以是B的实现类,也可以是B的实现类的子类的具体类。

    桥接模式与委托模式的区别是什么?

    桥接模式与策略模式的区别是什么?

    组合模式

    “容器”类和“叶子”类都实现“组件”接口,容器中可以存放多个组件(可以是容器或者叶子),组件包含组件,最后可以组合成多层的结构。

    装饰器模式

    装饰器和细分的组类都遵守“组件”协议,使用装饰器按不同顺序装饰细分组件可以得到不同的产品。

    表面模式

    基于现有工具库,编写一个便于调用的功能块给更高层的功能使用,使得高层的功能只在表面进行调用。

    享元模式

    将主类中静态、占内存大、重复性强的属性,作为一个独立享元;需要真正使用时,一个主类对象使用一个引用来拿取那个占内存大的属性。比如一张位图。

    代理模式

    代理和被代理者都遵守同一个协议,被代理者的关于协议的所有方法都会被代理。代理持有被代理者的引用。

    委托模式

    主对象将一部分方法交给委托实现,委托持有主对象的引用。

    3. 行为型 10

    责任链模式

    处理事务的结点组成一条链,从链头开始,当前结点对到来的事务进行处理,若处理不了,则丢给下一个结点。

    命令模式

    将事务分割为信号发送者和接收者,使用一个“命令”对象来沟通这两者。让发送与接收彼此隔离。

    迭代器模式

    主对象可以生成一个迭代器用于遍历主对象中的列表结构。

    中介者模式

    对于一些组件,设定一个中介者,组件对象向中介者注册(交出自己的引用),中介者帮助不同类型对象之间的沟通。

    中介者模式集中管理各组件的消息传递,避免组件之间相互耦合。

    命令模式是一个方向的消息传递(有控制的意味),中介模式可以多个对象之间双向地传递消息。

    备忘录模式

    设定一个备忘对象和一个备忘录对象(具有一个历史记录数组),存入时,主对象生成备忘对象,将备忘对象存入备忘录;撤销时,从备忘录取出最近的一个备忘对象,恢复为主对象。其中备忘对象应持有主对象的引用,便于恢复。

    观察者模式

    也称为订阅者模式。设定一个发布者和多个订阅者,订阅者若有向发布者注册,则会被加入发布者的通知列表,发布者在有新的变化的时候,依据通知列表来通知每个订阅者。

    状态模式

    设定一些状态对象(同遵守 “状态” 协议),主对象持有一个 “状态” 引用,主对象同一时刻只能有一种状态,使用多个状态对象来切换主对象的状态。“状态”协议持有主对象引用,便于状态对象代替主对象执行一些具体操作。

    策略模式

    设定一个策略协议,可以使用多种实现,在持有策略协议引用的地方,切换策略对象即可切换为另一种解决问题的方式。

    状态模式和策略模式都是使用切换对象引用的方式来实现功能,状态模式重点在于主对象的状态变化并引起主对象行为变化,而策略模式重点在于切换解决某项问题的策略以达到某些性能要求。

    模板方法模式

    父类定义了模板方法与默认的细分步骤,子类可依据个性要求重写细分步骤,但不能修改模板方法。模板方法保证了业务流程在子类中的一致性。

    访问者模式

    设定访问者,在得到主对象的接受的情况下(主对象传递自己的引用),查看主对象的属性,且不能影响到主对象的属性。


    以上就是基本的设计模式的简要说明,这就像《降龙十八掌》,每个招式都蕴含一些思考。现在,我们大致知道了有这些模式。这只是一个新的开始,若要真正懂它,还需要在写代码、看框架的时候多加思考,才可以融会贯通。

    至于其中有提出的问题,就当作挖坑,下一次有机会,我们一一解决。

    读者朋友若有类似的问题,评论区聊~ 🙋🏼🙋🏻‍♀️📡

  • 相关阅读:
    chapter3——处理多个时钟
    通达信股票交易接口dll怎么使用?
    【DP】大厂真题:小红书2023秋招提前批-连续子数组最大和
    百度云原生数据库GaiaDB的HTAP与多地多活技术实践
    Dockcer上传hub和配置国内镜像源
    易基因|深度综述:m6A RNA甲基化在大脑发育和疾病中的表观转录调控作用
    iOS 协程编程
    MySQL进阶篇(3)—锁、InnoDB引擎
    【Linux网络】工作环境救急——关于yum安装的5个花式操作
    2023/09/21 day5 qt
  • 原文地址:https://blog.csdn.net/weixin_39147809/article/details/127661567