当设计模式遇到Javascript (一 · 设计模式概述)

设计模式(Design pattern)是一套被反复使用多数人知晓的、经过分类编目的代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

可以看出,23种设计模式也不是凭空捏造出来的,而是经过了反复的推敲修改以及诸多的项目实战总结而出的代码设计经验。因此,能作为一种模式(pattern),设计模式不再是代码的罗列,而是扎实的逻辑结构,每一种设计模式都拥有成熟的思想。

设计模式的发展

既然是“模式”,那么容易得出设计模式可以应用于各种各样的编程语言中,而且所得出的表现都应该是一样的。对于一些像是C#、Java、C++这样的比较明确的面向对象的语言,一种设计模式在各语言之间的转换都是比较容易的,只是语法不同而已。但是,JavaScript作为一种弱类型的切十分灵活的语言,甚至没有明确的class这个关键字,随着Node和HTML5以及web2.0的兴起才开始受到比较多的重视,设计模式对她来讲就和变得和别的语言不同。

但是,很多东西Javascript都有,只是没有作为正式的部分。而设计模式又是一种编程的思想,思想是相同的,一旦你掌握了这种思想,代码就可以相通,利用一些javascript的特性来实现各种设计模式应该也不是一件特别难的事情。

设计原则

面向对象程序设计有几个原则:开闭原则、里氏转换原则、依赖倒转原则、接口隔离原则、合成/聚合复用原则、最小知识原则。开闭原则具有理想主义的色彩,它是面向对象设计的终极目标。设计模式正是通过实现这些原则来达到代码复用、增强可维护性的目的。

这些原则并不是固定的,任何人都可以提出更好的原则

开闭原则(Open Closed Principle,OCP)

此原则是由Bertrand Meyer提出的。原文是:“Software entities should be open for extension,but closed for modification”。

模块应对扩展开放,而对修改关闭。模块应尽量在不修改原来的代码的情况下进行扩展。

举个例子,假设现在有一个已经开发完成的规模不小的软件系统,有人提需求说我要再加一个功能,那么这时候去修改源代码显然是不明智的,不仅违反了开闭原则,而且那么多的代码,工作量肯定也很大。为了要实现这个需求,可以在原来的软件系统中扩展出来一个功能,只需要编写调试这个新功能模块的代码,这就是开放扩展,关闭修改

里氏代换原则(Liskov Substitution Principle,LSP)

里氏代换原则是由Barbara Liskov提出的。可以描述为:子类继承于父类,可以单独调用,如果调用的是父类的话,那么换成子类也完全可以运行。从开闭原则可以看出,设计模式一个重要的部分是抽象化,里氏代换原则从另一个角度描述了抽象(父类)和具体(子类)之间的关系。举例,猫科动物可以完成捕猎这个动作,而老虎也可以完成捕猎,在这个例子中,猫科动物就是父类,老虎是继承于猫科动物、从猫科动物这个类扩展出来的子类。

可以说:里氏代换原则是继承复用的一个基础。

依赖倒转原则(Dependency Inversion Principle,DIP)

若引用的对象有底层类型,那么就直接引用底层类型。高层模块不应该依赖于底层模块

换句话说,在程序里面调用的时候调用子类 ,子类依赖于父类,而父类不要依赖于子类。也就是说,细节依赖于抽象,可是抽象不应该依赖于细节。

依赖倒转原则要求程序设计时应该考虑如何针对抽象编程。

以计算机系统为例,依赖倒转原则要求要针对接口编程,而不是针对实现编程。无论键盘鼠标、CPU、内存等等这些硬件都是针对接口设计的,而如果要针对实现来设计,硬盘就要对应到某个特定(品牌/类型)的主板,那么换硬盘时就需要把主板也换掉。

接口隔离原则(Interface Segregation Principle,ISP)

每一个接口都是一个角色,客户端不应该依赖于它不需要的接口。

也就是:一个类对另一个类的依赖应该建立在最小的接口上

意思是这样的:应该把每一个接口都细化,针对类去设计接口。如果一个接口里含有太多的方法,而对很多类来说里面的很多方法都是用不到的,那么另外的类在实现这个接口时就要实现很多对它来说没用的方法,浪费人力物力。对一个类来说,实现很多它都能用得上的专用接口总比让它实现一个臃肿而又有很多它用不上的方法要划得来。

采用接口隔离原则对接口进行约束时,要注意以下几点:

接口尽量小,但是要有限度。对接口进行细化可以提高程序设计灵活性是不挣的事实,但是如果过小,则会造成接口数量过多,使设计复杂化。所以一定要适度。

为依赖接口的类定制服务,只暴露给调用的类它需要的方法,它不需要的方法则隐藏起来。只有专注地为一个模块提供定制服务,才能建立最小的依赖关系。

提高内聚,减少对外交互。使接口用最少的方法去完成最多的事情。

运用接口隔离原则,一定要适度,接口设计的过大或过小都不好。

合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)

了解这个原则应首先了解一下组合和聚合。

组合(合成)和聚合都是对象关系的一种。聚合表示整体与部分的关系,表示“含有”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。组合(合成)则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。在组合(合成)关系中,部分和整体的生命周期一样,组合的新的对象完全支配其组成部分,包括他们的创建和销毁。

复用原则的设计原则是:要尽量使用合成/聚合,尽量不要使用继承

最小知识原则(Principle of Least Knowledge,PLK,也叫迪米特法则)

一句话,一个对象应对其他对象有尽可能少的了解。

基本模式

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

结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。

行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。

———————————————————

有不对的地方欢迎指出~~~


【本文由“大智慧聪明者”发布,2017年3月28日】

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • title: 设计模式简介categories: 设计模式tags: 设计模式date: 2017-05-03 0...
    九命丿相柳阅读 580评论 0 0
  • 本文集网络上文章及自己coding和理解的结果而来,是设计模式学习的开篇。 本文介绍设计模式的一些概念,分类,和设...
    月落蝶殇阅读 492评论 0 0
  • 面向对象设计的五大原则 单一职责原则(SRP) 一个类应该仅有一个职责。 开放封闭原则(OCP) 对扩展开放,...
    LiuHDme阅读 1,447评论 0 3
  • 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者...
    RamboLI阅读 742评论 0 1
  • 做后台产品的时候,为了避免设计地凌乱,想了解一些系统设计模式思想,于是找高内聚低耦合相关的文章。这篇文章是摘自网友...
    徐薇薇阅读 2,179评论 0 0