00-设计模式简介

体会设计模式

设计模式是中级程序员向高级程序员过渡的关键,跨不过这道坎,无论有多少经验,你都不会真正体会到编程之美。

那么什么是设计模式?简单的说就是 套路、招数,和搏击中的套路和招数是一个意思。

我们学习一门语言(例如java),基本语法类似于搏击中的基本功(类似直拳、勾拳、侧踢),而设计模式则类似于组合技。

搏击中的组合技适合不同的场景,例如倒地的时候,如果对手的关节处于合适的位置,专业的格斗家会选择一个“十字绞”来完成一次绝杀。这个“十字绞”在搏击中被称为套路,如果用科学的语言说,这就是一个模式,可被称为“搏击模式”。而所谓的“搏击模式”就是无数的搏击家,在搏击实践中,总结出的,应对特殊场景下“最佳”搏击实践。

类似的,中国象棋中也有很多模式,例如“马后炮”、“连环马”等。

而《孙子兵法》、《三十六计》就讲解“战争模式”的书。

而设计模式,直白地说就是编程中的模式,它是过去的优秀程序员总结出的,面对特定编程问题的特殊“招式”,最佳实践。

设计模式在程序员的面试中会被考到,通常是介绍其原理并说出优缺点。或者对比几个比较相似的模式的异同点。在笔试中可能会出现画出某个设计模式的 UML 图这样的题。虽说面试中占的比重不大,但并不代表它不重要。

恰恰相反,设计模式对于程序员而言相当重要,它是我们写出优秀程序的保障。设计模式与程序员的架构能力与阅读源码的能力息息相关,非常值得我们深入学习。

面向对象的特点是可维护可复用可扩展灵活性好,它真正强大的地方在于:随着业务变得越来越复杂,面向对象依然能够使得程序结构良好,而面向过程却会导致程序越来越臃肿。

让面向对象保持结构良好的秘诀就是 设计模式。

设计模式的六大原则

设计模式的世界丰富多彩,比如生产一个个「产品」的工厂模式,衔接两个不相关接口的适配器模式,用不同的方式做同一件事的策略模式,构建步骤稳定、根据构建过程的不同配置构建出不同对象的建造者模式等。

设计模式基于六大原则

  • 开闭原则(Open Closed Principle)
    对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,

  • 单一职责原则(Single Responsibility Principle):一个类只做一件事,一个类应该只有一个引起它修改的原因。

  • 里氏替换原则(Liskov Substitution Principle ):子类应该可以完全替换父类。也就是说在使用继承时,只扩展新功能,而不要破坏父类原有的功能。
    里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

  • 依赖倒置原则(Dependence Inversion Principle):细节应该依赖于抽象,抽象不应依赖于细节。把抽象层放在程序设计的高层,并保持稳定,程序的细节变化由低层的实现层来完成。

  • 迪米特法则(Law of Demeter):又名「最少知道原则」,一个类不应知道自己操作的类的细节,换言之,只和朋友谈话,不和朋友的朋友谈话。
    一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

  • 接口隔离原则(Interface Segregation Principle):不要建立臃肿庞大的接口。
    使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

所有的设计模式都是为了程序能更好地满足这六大原则。

设计模式分类

设计模式一共有 23 种,总体来说设计模式分为三大类:

  • 创建型模式:对象实例化的模式,用于对象的创建对业务或应用逻辑是强依赖,或者创建的创景比较复杂的场景。

    • 工厂方法模式(Factory Pattern)
    • 抽象工厂模式(Abstract Factory Pattern)
    • 单例模式(Singleton Pattern)
    • 建造者模式(Builder Pattern)
    • 原型模式(Prototype Pattern)(不常用)。
  • 把类或对象结合在一起形成一个更大的结构。一般是解决不同的类之间有不同关系的情况。

    • 适配器模式(Adapter)
    • 装饰器模式(Decorator Pattern)
    • 代理模式()
    • 桥接模式(Bridge Pattern)
    • 外观模式(Facade Pattern)(不常用)
    • 组合模式(Composite Pattern)(不常用)
    • 享元模式(Flyweight Pattern)(不常用)
    • 装饰模式是为了 增强功能或添加功能,代理模式主要是为了加以控制
  • 类和对象如何交互,及划分责任和算法。

    • 策略模式(Strategy Pattern)
    • 模板方法模式(Template Pattern)
    • 观察者模式(Observer Pattern)
    • 迭代器模式(Iterator Pattern)
    • 责任链模式(Chain of Responsibility Pattern)
    • 状态模式(State Pattern)
    • 命令模式(Command Pattern)(不常用)
    • 备忘录模式(Memento Pattern)(不常用)
    • 访问者模式(Visitor Pattern)(不常用)
    • 中介者模式(Mediator Pattern)(不常用)
    • 解释器模式(Interpreter Pattern)(不常用)
  • 其实还有两类:并发型模式和线程池模式。


00-设计模式简介
https://flepeng.github.io/设计模式-00-设计模式简介/
作者
Lepeng
发布于
2021年3月8日
许可协议