坚持!再坚持一下!
设计模式
1. 设计模式
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化
2. 设计原则
-
S – Single Responsibility Principle 单一职责原则:一个程序只做好一件事;如果功能过于复杂就拆分开,每个部分保持独立
-
O – OpenClosed Principle 开放/封闭原则:对扩展开放,对修改封闭;增加需求时,扩展新代码,而非修改已有代码
-
L – Liskov Substitution Principle 里氏替换原则:子类能覆盖父类;父类能出现的地方子类就能出现
-
I – Interface Segregation Principle 接口隔离原则:保持接口的单一独立;类似单一职责原则,这里更关注接口
-
D – Dependency Inversion Principle 依赖倒转原则:面向接口编程,依赖于抽象而不依赖于具;使用方只关注接口而不关注具体类的实现
3. 前端常见的设计模式
(1)外观模式(Facade Pattern)
外观模式就是把多个子系统中复杂逻辑进行抽象,从而提供一个更统一、更简洁、更易用的API。
场景:JQuery就把复杂的原生DOM操作进行了抽象和封装,并消除了浏览器之间的兼容问题,从而提供了一个更高级更易用的版本。在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们之间的依赖。
优点:减少系统相互依赖。提高灵活性。提高了安全性。 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
(2)工厂模式(Factory Pattern)
工厂模式定义一个用于创建对象的接口,这个接口由子类决定实例化哪一个类。该模式使一个类的实例化延迟到了子类。而子类可以重写接口方法以便创建的时候指定自己的对象类型。
场景:需要依赖具体环境创建不同实例,这些实例都有相同的行为,这时候我们可以使用工厂模式,简化实现的过程,同时也可以减少每种对象所需的代码量,有利于消除对象间的耦合,提供更大的灵活性
优点:创建对象的过程可能很复杂,但我们只需要关心创建结果。构造函数和创建者分离, 符合“开闭原则”;一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。
(3)单例模式(Singleton Pattern)
当需要一个对象去贯穿整个系统执行某些任务时,单例模式就派上了用场
场景:定义命名空间和实现分支型方法。登录框。vuex 和 redux中的store
(4)观察者模式(Observer Pattern)
观察者模式又称发布-订阅模式(Publish/Subscribe Pattern). 被观察对象(subject)维护一组观察者(observer),当被观察对象状态改变时,通过调用观察者的某个方法将这些变化通知到观察者。
场景:DOM事件;vue 响应式
优点:目标对象与观察者之间的抽象耦合关系能单独扩展以及重用。增加了灵活性。观察者模式所做的工作就是在解耦,让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响到另一边的变化。
(5)代理模式(Proxy Pattern)
是为一个对象提供一个代用品或占位符,以便控制对它的访问
场景:HTML元 素事件代理。ES6 的 proxy
优点:代理模式能将代理对象与被调用对象分离,降低了系统的耦合度。代理模式在客户端和目标对象之间起到一个中介作用,这样可以起到保护目标对象的作用。代理对象可以扩展目标对象的功能;通过修改代理对象就可以了,符合开闭原则;
(6)策略模式(Strategy Pattern)
策略模式简单描述就是:对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。把它们一个个封装起来,并且使它们可以互相替换.
场景例子: 如果在一个系统里面有许多类,它们之间的区别仅在于它们的'行为',那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。一个系统需要动态地在几种算法中选择一种。表单验证