单一职责、开放-封闭、依赖倒转原则

内容摘录自《大话设计模式》

 

单一职责原则

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

如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。

例如,界面与游戏逻辑就应该进行分离,当要改变界面时,不过是窗体类的变化,和游戏逻辑无关,以此达到复用的目的。

软件设计真正要做的许多内容,就是发现职责并把那些职责相互分离。

 

开放-封闭原则

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

无论模块是多么的‘封闭’,都会存在一些无法对之封闭的变化。既然不可能完全封闭,设计人员必须对于他设计的模块应该对哪种变化封闭做出选择。他必须先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化。

一般来说很难预先猜测可能会发生的变化,但我们却可以在发生小变化时,就及早去想办法应对发生更大变化的可能。

 

依赖倒转原则

依赖倒转原则

A.高层模块不应该依赖低层模块。两个都应该依赖抽象。

B.抽象不应该依赖细节。细节应该依赖抽象。

把PC电脑理解成是大的软件系统,任何部件如CPU、内存、硬盘、显卡等都可以理解为程序中封装的类或程序集,由于PC易插拔的方式,不管哪一个出问题,都可以在不影响别的部件的前提下进行修改或替换。

这种易插拔,在面向对象里面就叫强内聚、松耦合

例如CPU的对外都是针脚式或触点式等标准的接口,CPU只需要把接口定义好,内部再复杂也不让外界知道,而主板只需要预留与CPU针脚的插槽就可以了。

单一职责原则,就修电脑来说,显然内存坏了,不应该成为更换CPU的理由,它们各自的职责是明确的。

开发-封闭原则,内存不够只要插槽足够就可以添加,硬盘不够可以用移动硬盘等,PC的接口是有限的,所以扩展有限,软件系统设计得好,却可以无限地扩展。

依赖倒转原则,说白了,就是要针对接口编程,不要对实现编程。无论主板、CPU、内存、硬盘都是在针对接口设计的,如果针对实现来设计,内存就要对应到具体的某个品牌的主板,那就会出现换内存需要把主板也换了的尴尬。

 

为什么叫倒转?

面向过程的开发时,为了使得常用代码可以复用,一般都会把常用代码写成函数的程序库,这样我们在做新项目时,去调用这些低层的函数就可以了。比如我们做的项目要访问数据库,就把访问数据库的代码写成了函数,每次做新项目时就去调用这些函数。这也就叫做高层模块依赖低层模块

问题也就出在这里,我们要做新项目时,发现业务逻辑的高层模块都是一样的,但客户却希望使用不同的数据库或存储信息方式,这时就出现麻烦了。我们希望能复用这些高层模块,但高层模块与低层的访问数据库是绑定在一起的,没办法复用。

就想刚才说的,PC里如果CPU、内存、硬盘都需要依赖具体的主板,主板一坏,所有的部件就都没用了,这显然不合理。反过来,如果内存坏了,也不应该造成其他部件不能用才对。而如果不管高层模块还是低层模块,它们都依赖于抽象,具体一点就是接口或抽象类,只要接口是稳定的,那么任何一个的更改都不用担心其他受到影响,这就使得无论高层模块还是低层模块都可以很容易的被复用

 

为什么依赖了抽象的接口或抽象类,就不怕更改呢?这就要说到里氏代换原则了。

里氏代换原则

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

白话翻译就是一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化。

正因为有了这个原则,使得继承复用成为了可能,只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

比方说,猫是继承动物类的,以动物的身份拥有吃、喝、跑、叫等行为,可等某一天,我们需要狗、牛、羊也拥有类似的行为,由于它们都是继承于动物,所以除了更改实例化的地方,程序其他处不需要改变。

对于开放-封闭原则来说,正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值