关闭

【大话一角】——六兄弟

标签: 设计模式
2595人阅读 评论(66) 收藏 举报
分类:

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

            

  (一)单一职责

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

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

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

  

  (二)开放—封闭

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

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

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


                 

                                              

    (三)里氏代换

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

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

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

             

          

   (四)依赖倒转

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

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

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

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

               

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

  

   (五)迪米特法则

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

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

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

          

   (六)聚合复用

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

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

            

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

     实例:

            

         

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


   小结

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


 


0
0
查看评论

大话数据结构——图

图(Graph)是由定点的又穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。一、各种图的定义图按是否有方向分可分为有向图和无向图。有向边用尖括号“<>”表示,无向边用小括号“()”表示。 简单图:无环无重复边。我...
  • u013159040
  • u013159040
  • 2016-06-14 16:31
  • 663

大话设计模式[中文PDF+源代码]

下载地址:http://feixueteam.net/thread-493-1-1.html
  • u013948190
  • u013948190
  • 2016-01-05 17:13
  • 7482

大话数据结构(六)——队列的两种java实现方式

记得说桟的时候用了羽毛球的例子:羽毛球盒只有一个端口,取出和放入都得从这个口进行,并且放入和取出的原则遵循“后入先出”的原则。而队列与桟的原则相反,桟的原理就好比这个羽毛球盒子是两头开的,放入的时候从一个口放入,而取出的时候从另一端取出,这样就使得先放入的先取出,后放入的后取出。这种先进先出的数据结...
  • u013393958
  • u013393958
  • 2017-05-27 18:46
  • 325

大话通信总结

技术: 1g gsm  gprs  cdma  lte  edge:gprs的继任者 gprs:传输分组数据,即非语音数据  172 gprs:包括的节点,sgsn  ggsn pcu
  • techtitan
  • techtitan
  • 2014-08-24 12:09
  • 1061

大话数据结构小结1

由于图片看不了,大家可以看这个百度云笔记,我看完大话数据结构整理的,里面有些内容我还不太明白,等过段时间还需要仔细回顾回顾。点击打开链接 一.数据及数据结构的基本概念 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 ...
  • aiyingwo
  • aiyingwo
  • 2015-11-19 11:02
  • 731

大话无线通信与大话移动通信

这两本是写的风趣幽默,浅显易懂,看完后可以对整个无线通信有个大概的了解,不错!不错! 一。大话无线通信: 2013.4.16 1. 频域的概念?是不是将方波分解为正弦波? 2. 傅里叶级数: 每个周期性的信号都可以分解为谐波关系的正弦级数来表示 3. 傅里叶级数的伟大之处就在于,把一个看上...
  • yazhouren
  • yazhouren
  • 2013-04-16 16:24
  • 1102

大话ceph crush

引言 那么问题来了,把一份数据存到一群Server中分几步? Ceph的答案是:两步。 计算PG计算OSD 计算PG 首先,要明确Ceph的一个规定:在Ceph中,一切皆对象。 不论是视频,文本,照片等一切格式的数据,Ceph统一将其看作是对象,因为追其根源,所有的数...
  • xiongwenwu
  • xiongwenwu
  • 2017-01-03 21:57
  • 735

《大话设计模式》读书笔记,附Java代码实现

花了不到一周时间读完了《大话设计模式》,并用Java实现了一遍,需要继续实战项目才能深刻理解设计模式。 代码托管在设计模式Java代码简要实现 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。策略模式就是用来封装算法的,但在实践...
  • doleria
  • doleria
  • 2017-05-21 23:53
  • 2384

大话数据结构与算法:基础篇

1.数据结构的重要性         数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论是否是科班出身(比如我,标准的非科班人员,我是学医的,哈哈)都不可以绕过数据结构与算法这部分知识。       &...
  • shenziheng1
  • shenziheng1
  • 2016-05-26 13:52
  • 1329

大话数据结构十一:字符串的模式匹配(KMP算法)

1. KMP算法简介: kmp算法是一种改进的字符串匹配算法,相比朴素算法,KMP算法预先计算出了一个哈希表,用来指导在匹配过程中匹配失败后尝试下次匹配的起始位置,以此避免重复的读入和匹配过程。这个哈希表被称为"部分匹配值表"(Particial match table),这...
  • zdp072
  • zdp072
  • 2013-10-27 09:14
  • 2759
    个人资料
    • 访问:564715次
    • 积分:18489
    • 等级:
    • 排名:第599名
    • 原创:274篇
    • 转载:20篇
    • 译文:0篇
    • 评论:5683条
    和我交谈
    点击这里给我发消息 点击这里给我发消息
    时间你好?
    博客专栏
    最新评论