JavaScript设计模式 – 设计原则

说明

可以说每种设计模式都是为了让代码迎合其中一个或者多个原则而出现的,他们本身已经融入到了设计模式之中

  1. 单一职责原则(SRP)
  2. 最少知识原则(LKP)(迪米特法则)
  3. 开放-封闭原则(OCP)
  4. 里氏转换原则
  5. 依赖倒转原则

1. 单一职责原则(SRP)

指的是,对一个类而言(包括对象和函数),应该仅有一个引起它变化的原因,如果一个对象承担了多项职责,就意味着这个对象将变得巨大,引起它变化的原因可能会有多个,面向对象设计鼓励将行为分布到细粒度的对象之中,如果一个对象承担的职责过多,等于把这些职责耦合到了一起,这种耦合会导致脆弱和第内聚的设计,当变化发生时,设计可能会遭到以外的破坏。

何时去分离职责

SRP 原则是所有原则当中最简单也是最难正确运用的原则之一,要明确的是,并不是所有的职责都应该一一分离。

  • 随着需求的变化,有两个职责总是同时变化,那就不必分离他们。

违反 SRP 原则

一方面我们受设计原则的指导,另一方面,我们未必要在任何时候都一成不变的遵守原则。实际开发中,因为种种原因违反 SRP 的情况并不少见。例如 jQuery 的 attr 方法 既负责赋值,又负责取值,这对 jQuery 的维护者来说会带来一些困难,但对于用户来说,却简化了使用。

SRP 的优缺点

  • 优点:降低单个对象的复杂度,按照职责分解成更小的粒度,有助于代码复用,一个职责变更时,不会影响到其他职责
  • 缺点: 增加总体复杂度,把对象按照职责分解成小粒度后,实际增加了对象之间的互相联系难度

2. 最少知识原则(LKP)

最少知识原则也叫迪米特法则,说的是一个软件实体应尽可能少的与其他实体发生互相作用。这里的软件实体是一个广义的概念,不仅包括系统、类、模块、函数、变量等

减少对象之间的联系

单一职责原则指导我们把对象划分成较小的粒度,这可以提高对象的可复用性,但越来越多的对象之间可能会产生错综复杂的联系,如果修改其中一个对象,可能会影响到跟他相互引用的其他对象。

最少知识原则要求我们在设计程序是,应当尽量减少对象之间的交互,如果两个对象之间不必彼此直接通信,那就不要发生直接的相互联系。

设计模式中的体现

  • 中介者模式:通过一个中介者对象,让所有的相关对象都通过中介者对象来通信,而不是互相引用,所以,当一个对象发生改变时,只需要通过中介者对象即可
  • 外观模式:为一组子系统提供一个简单的访问入口,隔离客户与复杂子系统的联系,客户不用去了解子系统的细节,子系统内部的修改也不会影响到外部引用

3. 开放-封闭原则(OCP)

软件实体(类、模块、函数)等应该是可以扩展的,但是不可以修改

当需要改变一个程序的功能或者给这个程序增加新功能的时候,可以使用增加代码的方式,但是不允许改动程序的源代码,相比修改源程序,如果增加几行代码就能解决问题,那显然更加的优雅,而且增加代码并不会影响原系统的稳定

如何遵守开放-封闭原则

1. 封装变化

找出程序中将要发生变化的地方,然后把变化封装起来,通过封装变化的方式,可以把系统中稳定不变的部分和容易变化的部分隔离开。在系统演变的过程中,我们只需要替换那些容易变化的部分,如果这些部分是封装好的,那么替换起来也相对容易。

2. 放置挂钩

放置挂钩也是分离变化的一种方式,我们在程序有可能发生变化的地方放置一个挂钩,挂钩的返回结果决定了程序的下一步走向。这样一来,原本的代码执行路径上就会出现一个分叉路口,程序未来的执行方向被预埋下多种可能性

3. 使用回调函数

回调函数是一种特殊的挂钩。我们可以把一部分易于变化的逻辑封装在回调函数里,然后把回调函数当做参数传入一个稳定和封闭的函数中,当回调函数被执行时,程序就可以因为回调函数的内部逻辑不通,而产生不同的结果

开放-封闭原则的相对性

让程序保持完全封闭是不容易做到的,就算技术上做得到,也需要花费太多的时间和精力。而且代价是引入了更多的抽象层次,增加代码复杂度

可以做的

  • 挑选出最容易发生变化的部分,然后构造抽象来封闭这些变化
  • 在不可避免发生修改时,尽量修改相对容易修改的部分,例如对开源库来说,修改提供的 配置文件,比修改源代码来的安全又简单

4. 里氏转换原则

子类可以扩展父类的功能,但是不能改变父类原有的功能

  • 子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
  • 子类可以增加自己特有的方法
  • 当子类方法重载父类的方法时, 方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
  • 当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格

5. 依赖倒转原则

抽象不应该依赖细节,细节应该依赖于抽象,说白了就是面向接口编程,而不是面向实现编程

  • 高层模块不应该依赖低层模块,两者都应该依赖其抽象
  • 抽象不应该依赖细节
  • 细节应该依赖抽象

文章列表

  1. javascript设计模式 – 设计原则
  2. JavaScript设计模式–高阶函数
  3. Javascript 设计模式 - 01 - 原型模式
  4. Javascript 设计模式 - 02 - 单例模式
  5. Javascript 设计模式 - 03 - 建造者模式
  6. Javascript 设计模式 - 04 - 工厂模式
  7. Javascript 设计模式 - 05 - 外观模式
  8. Javascript 设计模式 - 06 - 代理模式
  9. Javascript 设计模式 - 07 - 观察者模式(发布订阅模式)
  10. Javascript 设计模式 - 08 - 策略模式
  11. Javascript 设计模式 - 09 - 命令模式
  12. Javascript 设计模式 - 10 - 迭代器模式
  13. Javascript 设计模式 - 11 - 职责链模式
  14. Javascript 设计模式 - 12 - 适配器模式
  15. Javascript 设计模式 - 13 - 模板方法
  16. Javascript 设计模式 - 14 - 组合模式
  17. Javascript 设计模式 - 15 - 享元模式
  18. Javascript 设计模式 - 16 - 中介者模式
  19. Javascript 设计模式 - 17 - 装饰者模式
  20. Javascript 设计模式 - 18 - 状态模式

javascript设计模式--设计原则相关推荐

  1. JavaScript -- 设计模式 设计原则

    设计模式有很多,这些设计模式的出现是由准则或者说有根据的,不是平白无故出现的,下面我们就来认识一下这些设计原则. 在此以前,我想说一下,看这篇文章的读者应该都是前端工程师或者使用JS编程语言的程序员, ...

  2. 设计模式-设计原则(Design Principle)

    本文由@呆代待殆原创,转载请注明出处. 写在前面:所谓设计原则并不是一定要遵守的法则,只是一种建议,因为保持这些原则本身会有一定代价,若是这些代价超过了带来的好处就得不偿失了,所以一切还是以简单为准. ...

  3. 设计模式——设计原则

    设计模式--六种设计原则 1. 开闭原则:对扩展开放,对修改闭合 对扩展开放:有新的需求或变化时,通过现有代码进行扩展,来适应新的情况 对修改闭合:设计一旦完成,就可以独立完成工作,不对已有的代码进行 ...

  4. 模块递归拆分法: 设计模式 设计原则,复杂层次设计举例。系统重构 装饰模式,门面模式,代理模式

    程序员最牛逼的能力是模块拆分能力, 然后才能利用模块依赖的工具,java 9 或者 runtime期的osgi ,其他maven插件,maven build期. 其他idea插件,类似阿里云的代码规范 ...

  5. 设计模式-设计原则之里氏代换原则

    设计原则之里氏代换原则 里氏代换原则 案例(正方形不是长方形) 案例改进 里氏代换原则 里氏代换原则是面向对象设计的基本原则之一. 里氏代换原则:任何基类可以出现的地方,子类一定可以出现. 通俗理解: ...

  6. JAVA设计模式-设计原则(三)里氏代换原则

    1.概念  任何基类可以出现的地方,子类一定可以出现. 子类对象 能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏. 2.为什么使用里氏替换原则 继承优点:     ...

  7. 设计模式-设计原则-开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段...

    开闭原则是目标,里氏代换原则是基础,依赖倒转原则是手段,它们相辅相成,相互补充,目标一致,只是分析问题时所站角度不同而已. 转载于:https://www.cnblogs.com/jiangtao12 ...

  8. 设计模式-设计原则之迪米特原则

    例子 假设老板给项目组长下达一个任务,让其去查询课程的数量 代码 public class Course {} public class TeamLeader {public void checkNu ...

  9. .NET 云原生架构师训练营(设计原则设计模式)--学习笔记

    ▲ 点击上方"DotNet NB"关注公众号 回复"1"获取开发者路线图 学习分享 丨作者 / 郑 子 铭 这是DotNet NB 公众号的第180篇原创文章 ...

  10. javascript设计模式_JavaScript 设计模式 学习总结

    ---------------------------------------------------------------------------------------------------- ...

最新文章

  1. 新书介绍 | 图算法指南,A Guide to Graph Algorithms
  2. python画曲线图例-Python数据可视化之Matplotlib(折线图)
  3. JQuery中的样式操作
  4. 怎么查看SQL SERVER 2000是否打过SP4的补丁
  5. rfc 查看工具_用于系统管理员的杀手级工具,Skype替代品,提高Linux技能,6个必读的RFC等
  6. 一般php的入口在哪,PHP单入口是否是必须的
  7. mysql中member_在MySql中实现MemberShip的权限管理
  8. java网络病毒,网络病毒是由因特网衍生出的新一代病毒,即Java及ActiveX病毒。由于(),因此不被人们察觉。...
  9. 创建一个带有Event Receiver的List Definition
  10. 依据经纬度解析商圈scala实现
  11. Tecplot 360 EX 2020 R1中文版
  12. tensorflow 77 tensorflow android版本demo win10 下 编译
  13. Java实现图片验证码功能
  14. python解决约瑟夫问题
  15. 转:以Delphi Package架构多人开发应用程序环境
  16. 原神手游怎么用电脑玩 原神模拟器玩法教程
  17. C语言 运算符优先级表
  18. 怎么解决 接口请求 504 Gateway Time-out
  19. ISO/IEC 14443协议浅谈:TYPE A与TYPE B
  20. 给Flutter中的Widget设置透明度

热门文章

  1. python实现商品进销存管理系统
  2. 我爱你 php代码怎么打,微信翻译代码我爱你怎么写?微信翻译表白代码介绍大全...
  3. 物联网 毕业设计——方案选择
  4. 正确的座机号码格式_简历里的手机号及座机号的标准写法是什么?正确书写才更可能求职成功!...
  5. SpringBoot使用Ehcache
  6. office插件开发_推荐!办公必备,Office插件大合集
  7. [收藏]使用GDI+绘制高质量图和字体
  8. 美国计算机专业nlp大学排名,美国人工智能专业排名前7的一流学府 看看哪所院校最令你心动吧!...
  9. 区块链对人类产生的变革
  10. DHCP报文及其格式