【大话一角】——六兄弟

简介: 【大话一角】——六兄弟

在大话这本书中我认识了很好的六个兄弟他们就是设计模式中的六个原则——单一职责原则、里氏代换原则、开放—封闭原则、依赖倒转原则、迪米特法则、合成/复用原则。这几个兄弟非常的讲义气,在我进入设计模式的学习的开始他们几个就陆续的出来陪伴我,并且一直从开始陪伴到结束,他们帮我分别程序中的不良行为,当然他们也非常的喜欢和大家交朋友,下面我就把我的这六位兄弟一一介绍给大家。


20141122113748812.jpg

(一)单一职责


定义:就一个类而言,应该仅有一个引起它变化的原因。


详解:这个原则主要是防止类的职责过多问题,当一个类的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。


实例:我们现在的大公司都有很好的组织结构,各个部门都只负责自己的任务,研发就关心研发,销售就关心销售等,如果一个庞大的公司只有一个部门一个负责人,那么它的各个流程都互相影响,那么结果就可想而知了。


(二)开放—封闭


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


详解:开放封闭原则是面向对象的核心所在,遵循这个原则可带来面向对象技术所声称的巨大好处:也就是可维护、可扩展、可复用、灵活性好、开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象,然而对应应用程序中的每个部分都刻意的进行抽象不是一个好主意,拒绝不成熟的抽象和抽象本身一样重要。此原则简单的说就是“关闭修改,开放扩展”,这样我们可以更好的使系统在第一个版本后不断的推出新版本。


实例:公司的工资管理系统中,因为我们有很多的不同的工人,工资计算就有很多的不同,按小时计算、按月计算、按年计算,现在要求增加一个基本工资和提成的计算方法。


20141122140135043.jpg


20141122140540962.jpg


(三)里氏代换


定义:子类必须能够替换掉它们讷的父类。


详解:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出来父类和子类的对象的区别,也就说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。这个原则是继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响,父类才能被真正的复用,而子类才能在父类的基础上增加新的行为!


实例:在古时兄妹很多,并且子女的手艺都是从父亲那里继承,就像扑鱼的技术,种地的方法等,并且随着时代的进步,子类会摸索自己新的技术和方法:



(四)依赖倒转


定义:高层模块不应该依赖底层模块,两个都应该依赖抽象;


抽象不应该依赖心结,细节应该依赖抽象;


详解:依赖倒转其实可以说是面向对象设计的标识,用那种语言来写程序不重要,如果编写是考虑的都是如何针对抽象编程而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象设计,反之那就是过程化的设计了。


实例1:当我们开发较大的项目的时候,我们会访问数据库,所以我们就把访问数据库的代码写出了函数,每次做新项目的时候就去调用这些函数,这就是高层模块依赖底层模块。


20141122144221408.jpg

实例2:就想我们的PC机,CPU、内存、硬盘都需要具体的主板,主板一坏,所有部件就都没有用了,这显然是不合理,反过来,如果内存坏了,也不应该影响其他部件不能用才对,而不管是高层模块还是底层模块都依赖抽象,具体来说就是接口或者抽象类才是最合理的。


(五)迪米特法则


定义:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。


详解:迪米特法则的根本思想是强调了类之间的松耦合,在类的结构设计上,每一个类都应当尽量降低成员的访问权限,这就是说类应该包装好自己的private状态,不需要让别的类知道的字段或行为就不要公开,因为类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。


实例:我们的小区最重要的一个部门就是物业部,它关系着居民的日常生活的方方面面,当居民有事情需要物业来解决的时候,我们直接给物业部打电话,而不是找具体的人;



20141122150507234.jpg(六)聚合复用


定义:在程序中我们尽量的用组合/聚合来代替类的继承。


详解:聚合表示一种弱的 ‘拥有关系’,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;组合则是一种强的 ‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样;


20141122151341976.jpg


优先使用对象的组合/聚合将有助于你保持每个类都被封装,并被集中在单个任务上,这样类和类继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。


实例:



20141122152910671.jpg20141122152432593.jpg从上面两张类图中我们可以看出,对象的继承关系是在编译是就定义好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化,当你需要复用子类是如果继承下来的实现不适合解决新问题,则父类必须重写或被其他更适合的类替换,这种依赖关系限制了灵活性并最终限制了复用性。


小结


通过上面的介绍我就把我的六个好兄弟介绍给大家了,其中开放封闭这个哥们很值得我们好好的和他交流,我就在前一段时间带领着我这六位兄弟打下了设计模式这一片天下,他们说会一直跟随我继续在编程这条路上打天下,一起走向胜利的巅峰!


目录
相关文章
|
5月前
|
JavaScript BI
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
技术笔记:JS获取子节点、父节点和兄弟节点的方法实例总结
64 0
剑指offer 76. 树中两个结点的最低公共祖先
剑指offer 76. 树中两个结点的最低公共祖先
66 0
|
JavaScript
DOM ------ 兄弟节点
DOM ------ 兄弟节点
|
JavaScript 前端开发
【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
194 0
|
JavaScript 前端开发
JavaScript 获取子节点、父节点、兄弟节点方法总结
JavaScript 获取子节点、父节点、兄弟节点方法总结
744 0
JavaScript 获取子节点、父节点、兄弟节点方法总结
|
JavaScript 算法 前端开发
js 递归获取子节点所有父节点,深度遍历获取第一个子树
js 递归获取子节点所有父节点,深度遍历获取第一个子树
709 0
|
JavaScript 索引
jquery 获取元素(父节点,子节点,兄弟节点)
jquery 获取元素(父节点,子节点,兄弟节点)
|
算法
打印x的所有祖先结点
打印x的所有祖先结点
138 0
节点操作之兄弟节点
节点操作之获取兄弟节点 前面我们了解了如何获取元素,我们通过document.getElementById等等来获取元素,但是这样的方法有很大的局限性,我们只能一个一个的去获取元素,很不方便。