设计模式学习笔记

47 阅读8分钟

设计原则

  1. 单一职责原则:方法或类所完成的功能应该是单一的。

  2. 开闭原则:对扩展开放,对修改关闭。

  3. 里氏替换原则:在任何父类出现的地方,子类也一定可以出现。

  4. 接口隔离原则:对高层接口的独立、分化,客户端对类的依赖基于最小接口,而不依赖不需要的接口,一个接口只对应一个职能。接口隔离原则与单一职责原则如出一辙,只不过前者是对高层行为能力的一种单一职责规范。

  5. 依赖倒置原则:高层模块只依赖上层抽象,不依赖具体的底层实现。

  6. 迪米特法则:最少知识原则,模块与模块之间应该彼此陌生,以此最小化、简单化模块间的通讯,达到松耦合的目的。

设计模式

  1. 单例模式:系统中只存在一个实例,同时提供集中、统一的访问接口,以使系统行为保持一致。(饿汉模式)初始阶段就主动进行实例化,无论此单例是否会被使用,提供一个静态方法获取实例;(懒汉模式)第一次使用时实例化,之后直接调用实例,在多线程并发请求时需要加同步锁。

  2. 原型模式:原型模式达到以原型实例创建副本实例的目的即可,并不需要知道其原始类,用对象创建对象,而不是用类创建对象,以此达到效率的提升。直接拷贝原型对象数据流生成新的副本对象,不会触发一些多余的复杂操作(如类加载、实例化、初始化等),效率高于“new”关键字触发的实例化操作。

  3. 工厂模式:工厂方法往往是对对象构造、实例化、初始化过程的封装,进行接口规范化,以允许子类决定具体实现,最终降低系统耦合度,使系统的可维护性、可扩展性等得到提升。

  4. 抽象工厂模式:工厂模式的高度集群化,将各种实例分门别类,基于此来规划各种工厂的接口,最终确立实例的顶级规范,使其与具体实例彻底脱钩。类似于品牌与系列。

  5. 建造者模式(生成器模式):主要用于复杂对象的构建、初始化,将多个简单的组件对象按顺序组装起来,最终构建成一个复杂的对象。与工厂模式不同的是,建造者模式主要目的是把繁琐的构建过程从不同对象中抽离出来,使其脱离并独立于产品类与工厂类。

  6. 门面模式:将多个不同子系统接口封装起来,并对外提供统一的高层接口,使复杂的子系统变得易用。

  7. 组合模式:针对由多个节点对象组成的树形结构的对象,能够使在操作整体对象或其下的每个节点对象时做出统一的响应,保证树形结构对象使用方法的一致性,不必关心对象的整体或部分。

  8. 装饰器模式:能够在运行时动态地为原始对象增加一些额外的功能。类似于继承,区别在于,继承是在编译时静态地通过对原始类地继承完成的,装饰器模式是通过对原始对象动态地包装完成,是对类实例装饰地结果。

  9. 适配器模式:当一个对象或类的接口不能匹配用户所期望的接口时,适配器充当中间转换的角色,已达到兼容用户接口的目的,同时也实现了客户端与接口的解耦。

  10. 享元模式:英文flyweight是轻量级的意思,当系统存在大量对象,且它们具有相同内部状态时,可以用享元模式共享相同的元件对象。本质是,将对象的内蕴状态与外蕴状态剥离,内蕴状态成为真正的“元”数据,外蕴状态则被抽离出去由外部负责维护。

  11. 代理模式:当客户端不能或不适合直接访问目标对象时,目标对象可以通过代理将自己托管起来,使客户端通过代理间接访问目标对象。代理模式不仅能增强原来的功能,还能对其进行管控,以及提高访问的隐私性与安全性。

  12. 桥接模式:将抽象与实现分离,使二者可以独自变化不受对方约束,使用时再将它们组合起来,就像桥梁一样连接它们的功能,降低抽象与实现的耦合度,保证系统的可扩展性。例如图形的形状和颜色。

  13. 模板方法模式:对一系列类行为的模式化,将总结出来的行为规律固化在基类中,对具体的行为实现则进行抽象化并交给子类去完成,以此实现子类对基类模板的套用。类似于制定表格。

  14. 迭代器模式:提供一种机制来按顺序访问集合中的各元素,而不需要知道集合内部的构造。满足了对集合迭代的需求,并向外提供一种统一的迭代方式,而不必暴露集合的内部数据结构。

  15. 责任链模式:允许业务请求者将责任链视为一个整体并对其发起请求,而不必关心链条内部具体的业务逻辑与流程走向。本质是处理某种连续的工作流,并确保业务能够被传递到相应的责任节点上得到处理。

  16. 策略模式:强调的是行为的灵活切换,比如一个类的多个方法有着类似的行为接口,可以将它们抽离出来作为一系列策略类,在运行时灵活对接,变更其算法策略,以适应不同的场景。

  17. 状态模式:架构出一套完备的事物内部状态转换机制,并将内部状态包裹起来且对外部不可见,使其行为能随其状态的改变而改变,同时简化事物的复杂的状态变化逻辑。状态模式与策略模式非常类似,其不同之处在于,策略模式是将策略算法抽离出来并由外部注入,从而引发不同的系统行为,其可扩展性更好;而状态模式则将状态及其行为响应机制抽离出来,这能让系统状态与行为响应有更好的逻辑控制能力,并实现系统状态主动式的自我转换。

  18. 备忘录模式:可以在不破坏元对象封装性的前提下捕获其在某些时刻的内部状态,并像历史快照一样将它们保存在元对象之外,以备恢复之用。但无限制地对元对象进行快照备份,可能会导致内存空间资源的过度消耗。

  19. 中介模式:为对象架构出一个互动平台,通过减少对象间的依赖程度以达到解耦的目的,让各个模块之间的关系更加松散、独立,增强系统的可复用性与可扩展性,同时提高系统的运行效率。

  20. 命令模式:能够将指令信息封装成一个对象,并将此对象作为参数发送给接收方执行,以使命令的请求方与执行方解耦,双方只通过传递各种命令对象来完成任务,还支持命令的批量执行、顺序执行以及反执行等操作。可以使系统忽略命令执行方接口的多样性与复杂性,将接口对接与业务逻辑交给具体的命令去实现,并且实现命令的无限扩展。

  21. 访问者模式:主要解决的是数据与算法的耦合问题,尤其是在数据结构比较稳定,而算法多变的情况下。访问者模式将多种算法独立归类,并在访问数据时根据数据类型自动切换到对应的算法,实现数据的自动响应机制,并且确保算法的自由扩展。

  22. 观察者模式:可以针对被观察对象与观察对象之间一对多的依赖关系建立起一种行为自动触发机制,当被观察对象状态发生变化时主动对外发起广播,以通知所有观察者做出响应。

  23. 解释器模式:针对某种语言并基于其语法特征创建一系列的表达式类,利用树结构模式将表达式对象组装起来,最终将其翻译成计算机能够识别并执行的语义树。解释器模式完美地对各种表达式进行拆分、抽象、关系化与多态化,定义出一个完备的语法构建框架,最终通过表达式的组装与递归调用完成对目标语言的解释。基于自相似性的树形结构构建的表达式模型使系统具备良好的代码易读性与可维护性,灵活多态的表达式也使系统的可扩展性得到全面提升。

推荐书籍

《秒懂设计模式》

《JavaScript设计模式与开发实践》