设计模式与前端:优缺点以及使用场景(二)| 青训营

65 阅读7分钟

1:设计模式的原则

上回书说到设计模式的定义,相信大家对设计模式的基本概念和背景都有所了解,今天我们进一步来谈谈设计模式。 就像几何学通过一套公理来建构自己的知识体系一样,设计模式的概念也是从几个设计原则慢慢总结出来的。GoF首先提出了设计模式主要是基于的两大面向对象设计原则:

1: 对接口编程而不是对实现编程。

2: 优先使用对象组合而不是继承。

那么我们立刻就会有一个疑问,设计模式为什么要基于上面两大原则呢? 任何事物的存在都是有原因的,我们来问一下AI怎么说。

这两个原则是面向对象设计中的重要原则,可以帮助开发者编写可维护、灵活和可扩展的代码。

面向接口编程而不是实现编程(Program to an interface, not an implementation):
这个原则强调在代码中应该针对接口(抽象)编程,而不是具体的实现类。接口定义了行为和约定,它们提供了一种规
范,使得不同的实现可以互相替换。通过面向接口编程,代码与特定实现解耦,提高了代码的灵活性、可扩展性和可维
护性。如果代码依赖于具体实现,当实现发生变化时,需要修改依赖的代码,这会增加代码的脆弱性。而通过依赖接口
,可以轻松地切换不同的实现,而无需修改使用该接口的代码。

优先使用对象组合而不是继承(Favor object composition over inheritance):
这个原则鼓励使用对象组合来实现代码的复用和扩展,而不是过度依赖继承关系。通过对象组合,可以将多个对象组合
起来形成更复杂的对象,这样可以更灵活地实现功能,并且在需要修改时也更容易维护。相比之下,继承关系在某些情
况下可能引入不必要的复杂性和耦合性。另外,对象组合还允许在运行时动态地改变对象之间的关系,而继承关系在编
译时就已经确定,不够灵活。

使用对象组合而不是继承可以减少类之间的紧耦合,提高代码的灵活性和可维护性。对象组合还更好地体现了"has-a"
关系,而不是"is-a"关系,更符合实际对象之间的关联关系。当需要扩展功能时,通过组合可以更方便地添加新功能而
不需要修改现有的代码,同时也避免了继承可能导致的继承层次过深和复杂性增加的问题。

综上所述,这两个原则都强调了松耦合、灵活性和可维护性的重要性,可以帮助开发者设计出更好的面向对象代码。

想要想法不得了,设计原则不能少。GaF23设计模式还有另外七大设计原则,字数太多了,完全可以跳到第二节

1、**开闭原则(** **Open Close Principle** **)**

对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

 
2、**里氏代换原则(** **Liskov Substitution Principle** **)**

里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。里氏代换原则是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

继承必须保证父类所拥有的性质在子类中依然成立。不要改父类原有的功能,尽量在子类中添加新的方法添加新的功能,否则复用性就会越来越差。
 

3、**依赖倒转原则(** **Dependence Inversion Principle** **)**

这个原则是开闭原则的基础。面向接口编程,不要面向实现编程。


**4、** **单一职责原则(** **Single Responsibility Principle** **)******

单一职责原则的定义是:应该有且仅有一个原因引起类的变更。一个方法尽可能干好一件事情(原子性)。控制类的粒度大小、将对象解耦、提高其内聚性。


5、**接口隔离原则(** **Interface Segregation Principle** **)**

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


6、**迪米特法则,又称最少知道原则(** **Demeter Principle** **)**

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。 只和你的直接朋友交谈,不和陌生人说话。比如说A-B-C  AB是朋友、bc是朋友、a想和c通信 最好通过第三方b进行 不要直接通信

为了降低类之间的耦合性,提高模块之间的独立性 (可能会提高复杂性)

 
7、**合成复用原则(** **Composite Reuse Principle** **)**

尽量先使用合成/聚合的方式,其次再考虑使用继承。

2:设计模式的分类

终于要讲设计模式的本体了,在讲具体的设计模式之前为了对设计模式有一个统摄性的认识,先了解一下设计模式的分类。

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

    1. 创建型模式(描述怎么去创建一个对象,想办法把创建对象和使用分离), 对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。

    共5种:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。

    1. 结构型模式(描述怎么将一个类或者对象按照某种布局组成一些更大的结构) 关注于对象的组成以及对象之间的依赖关系,描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构。

    共7种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

    1. 行为型模式(描述类或者对象之间怎么能相互协作去共同完成单个对象无法完成的任务,主要是分配一些职责), 关注于对象的行为问题,是对在不同的对象之间划分责任和算法的抽象化;不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。

    共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

aHR0cDovL3B4MXZrejlwei5ia3QuY2xvdWRkbi5jb20vJUU4JUFFJUJFJUU4JUFFJUExJUU2JUE4JUExJUU1JUJDJThGdy5wbmc.png