设计模式之六大原则

       设计模式中有六大原则,即单一职责原则、开放-封闭原则、依赖倒转原则、里氏代换原则、迪米特法则和合成/聚合复用原则,设计模式的学习应用是为了更好面向对象编程,从而做到可维护、可扩展、可复用、灵活性好。而设计模式就是基于基本原则总结出来的,所以,设计模式的六大原则就相当于裁判。

        

       单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。

       开放-封闭原则:软件实体(类、模块、函数等)应该可以扩展,但是不可修改。

       依赖倒转原则:A、高层模块不应该依赖低层模块,两个都应该依赖抽象;

                                 B、抽象不应该依赖细节,细节应该依赖抽象。

       里氏代换原则:子类型必须能够替换掉它们的父类型。

       合成/聚合复用原则:尽量使用合成/聚合,尽量不要使用类继承。

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

       下面对各个原则具体介绍

       一、单一职责原则

      单一职责原则就是一个类的功能要尽可能的单一,如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或抑制这个类完成其他职责的能力,这种耦合会导致脆弱的设计,当变化发生时,设计会遭受意想不到的破坏。就像现在的智能手机有着游戏、拍照、办公、音乐等功能,可是这么多的功能有那一项超过了Xbox、单反和笔记本呢,相反,功能多了,手机还容易出各种问题了。

       对于软件开发来说,一个类的职责越多,功能越复杂,这个类的性能越差。因此,如果一个类具有多余一个的职责,就应该考虑类的分离。就像下面这东西,还会用得顺手吗?万一坏了一个,修起来麻烦不?

       

       二、开放-封闭原则

      开闭原则简单来说就是对扩展开放,对修改关闭。我们做系统的时候由于需求是不断变化的,那么也就要求程序设计时也要做到可修改,不至于新的需求一来,发现程序已经写死了,要修改得推倒重来,这就要求我们在编程的时候要遵循开闭原则了,把一个类尽量完善,新需求来直接增加类就可以了,原来的类尽量不动,以保持相对稳定。

       开闭原则是面向对象设计的核心所在,遵循这个原则就容易实现可维护、可扩展、可复用、灵活性好等面向对象声称的好处了。就拿书上的例子来看,原先只是一个加法功能,但是后来又让你完善加入减法、乘法...那么你就要更改原来的类了,而如果抽象出一个运算类,那么就可以直接运用继承的方法,增添减法类、乘法类等运算类了。

       

       三、依赖倒转原则

     依赖倒转原则说白了就是针对接口编程,不要对实现编程。高层模块不要依赖低层模块,也就是要低耦合,让所有的类去依赖于接口或抽象类,这样就能够很容易的实现复用了。就像组装汽车,各个部件的安装都是依靠什么螺丝轴承的吧,这就是接口,然后轮胎坏了卸下就来换轮胎,发动机坏了就换发动机,但如果整辆车都给你焊一块,封死了,如果只坏了一个轮胎,那你就只能换辆新车了。

        

       四、里氏代换原则

      里氏代换原则就是说,子类型必须能够替换掉它们的父类型。正因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为,这样才能做到开放-封闭。换句话,子类要对父类大声地说:你的全都是我的,但我的还是我的。

       企鹅显然是一种鸟,并继承了鸟类,但是企鹅会飞吗?不会。这就违反了里氏代换原则,在类设计中,企鹅就不应该继承鸟类,而该从鸟中分离出一个不会飞的类,由企鹅去继承。

       

       五、迪米特法则

      迪米特法则就是说,类对其他类知道的越少越好,强调类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。如果需要调用另一个类的方法,可以通过第三者来实现。

       举例来看,公司为什么要组建那么多诸如研发部、业务部、销售部之类的部门,并且设置主管职位,就是当一项任务下发的时候确保任务能够及时被分配下去,不在其位不谋其政,你拿着U盘去某个部门找小张打印资料,小张有事不在,其他人不想管,那你咋办?这时候找主管就对了,主管的命令谁敢不听!

        

       六、合成\聚合复用原则

     合成、聚合有木有很熟悉?UML中讲过的,它们都是关联的特殊种类。聚合表示一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强的‘拥有’关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。合成\聚合如下图,自己悟吧...

       

       好处:优先使用对象的合成\聚合将有助于你保持每个类被封装,并被集中在单个任务上,这样类和继承层次会保持较小规模,因为继承是一种强耦合的结构,父类变,子类就要变,那么不断的继承呢?所以优先使用对象的合成聚合是很有必要的。

       小结

     设计原则的学习在我们更好的进行面向对象设计时给予了指导,从而做到面向对象、复用、变化的代价极小和可扩展,制作出一个敏捷设计的软件,我们不是代码搬运工,反而是艺术家,相信随着学习的深入,我们能够在OOD上更加熟练精通!

        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值