面向对象的七大设计原则

面向对象的七大设计原则

1.开闭原则(Open-Closed Principle,OCP)

开闭原则定义:软件实体对扩展是开放的,但对修改是关闭的。意思就是说在不修改软件实体的基础上去扩展其他功能。

举例:

在这里插入图片描述

有用户想买一个宠物狗,他可以直接调用dog类buy方法进行购买。

突然女儿告诉他想要只猫,我们如果在dog类中修改代码(例如使用else if判断或者switch进行选择)显然是违背了开闭原则中对修改关闭这一条准则的。于是调整为以下方案。

在这里插入图片描述

这样就完成了扩展,就可以买猫了。

总结:

原来我们去买狗,可以直接在卖狗的地方进行购买,突然女儿要只猫,理论上来说只要给钱,在买狗的地方也可以搞到一只猫。我们不这么做的原因是,不正规。毕竟在单独买狗这里买狗是没有问题的,但是买猫就存在一个名不正言不顺的问题。所以现在我们直接去宠物店购买。告诉店员我们要一只狗和一只猫即可。

2.单一职责原则(Simple Responsibility Principle,SRP)

每一个类专注于一个职责,如果这个类发生了改变,那么应该只有一个原因导致了类的变化。

如果一个类具有多个职责,应该把这多个职责分离出去,再分别创建一些类去一一完成这些职责

举例:

在这里插入图片描述

存在一个宠物店的类,其中包含众多方法,可以运行吗,毫无疑问,可以,但是很明显违背了单一职责原则,按照原则来说宠物店的类发生改变,应该只有一个原因。目前的类如果发生改变,就会可能有钱的原因,宠物的原因,以及场地清理的原因,所以不符合规范。所以我们将分为以下的方案:

在这里插入图片描述

这样就符合了规范。

总结:正所谓不想当将军的士兵不是好士兵,代码也是一样,不规范的代码不是好代码。这个宠物店的类就好比宠物店,main方法就好比店长,Introduction好比销售,Front好比收银员,clean就像清洁工。如此一来,各个岗位分明,看起来这个宠物店就比较正规。一进点,销售会给你介绍情况,介绍完了,可以购买了就去前台支付。一切结束了交给清洁工收尾。那么就会有一个问题,这些用一个人不久好了。理论上来说是可以,但是不会有人干,除非你加钱。代码也是一样,你加钱了就代表维护变得更艰难了。那么又有一个问题就是我加钱了总比我给3个人的钱要好吧。从理论上来说是的。首先的问题是不规范。其次,一个人相当于打三份工,也会疲倦。假设有一天辞职了,你要找人吧,能找到一个有三份专业都应付的过来的人吗。很难,那么就会进行培训才行,浪费时间。代码也是一样。你全部弄到一起,别人来看的时候很难受,并且浪费时间。还不如搞规范一点,至少这样专业。你会去一个专业的宠物店,还是不专业的?公司招人是想要专业的还是不专业的?

3.里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则核心:在软件系统中,一个可以接受父类对象的地方必然可以接受子类对象

里氏替换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。里氏替换原则是实现开闭原则的重要方式之一,由于使用基类对象的地方都可以使用子类对象,因此在程序中尽量使用基类类型来对对象进行定义,而在运行时再确定其子类类型,用子类对象来替换父类对象。

举例:
在这里插入图片描述

宠物店类有两个医生,可以给宠物开证明证明宠物很健康。现在规模变大了,又招了一个医生c,那么我们就回去修改宠物店类。这违反了开闭原则。所以现在使用里氏替换原则重构代码

在这里插入图片描述

重构后,A,B,C都属于权威医院的人。都可以开相关的证书。同时辞职或者招聘。直接删除添加就是,不会去修改类。

使用里氏替换原则时需要注意,子类的所有方法必须在父类中声明,或子类必须实现父类中声明的所有方法。尽量把父类设计为抽象类或者接口,让子类继承父类或实现父接口,并实现在父类中声明的方法,运行时,子类实例替换父类实例,我们可以很方便地扩展系统的功能,同时无须修改原有子类的代码,增加新的功能可以通过增加一个新的子类来实现。

总结:根据里氏替换原则,我们进行宣传的时候可以说,我们宠物店宠物都是健康的有权威医院的证明。这个时候用户来买宠物就会要证明。我们就可以给他看A医生开的证明。可能会有人说。我直接去宣传有A医生坐镇宠物店,可以证明宠物是健康的,这不就可以了吗。这有两个问题。首先的问题就是不规范,你说A是正经医生就是吗?而权威医院耳熟能详,用户也会信一点。第二个问题就是A突然出问题了,有人曝光他收了钱,做假证。这样的话,你以前的A开出的证书具有权威吗?即使有也没有了。这对宠物店来说无疑会产生影响。如果宣传的是权威医院,那么相对来说宠物店的损失降到了最低,因为我已经采用了其他医生的证明。这一舆论只会对权威医院产生影响。总之我可以把权威医院的证书替换成医院下的医生开的证书给用户看。但是我不能用医院下的医生的证书来代表医院的证书给用户看,因为可能会出现,这只是医生的个人行为和医院无关的情况。

4.依赖倒置原则(Dependence Inversion Principle,DIP)

依赖倒置原则的核心思想就是:要依赖于抽象,不要依赖于具体的实现。上层不依赖下层

一、高层模块不应该依赖底层模块,这两者应该依赖与其抽象

二、抽想不应该依赖细节

三、细节应依赖抽象

举例:

在这里插入图片描述

如上图,老板依赖店主带来的收益发奖金,店主给店员发奖金,奖金依赖于打卡和订单数量。这貌似没有问题,能执行吗?能。但是有一定的问题。老板心想:我是老板啊,我咋干的好像是吃软饭的。这不行。店长心想:我干的很好了,奖金这么点,是不是他少给了我几百。店长给店员发奖金,但是奖金依赖打卡和订单数。店员心想,我一个月兢兢业业。订单数了不够那是我的原因吗?就因为这个不给我奖金?我不服。况且还有几袋猫粮不在了,还说是我带回去了。不行,我得辞职。

后来经过依赖倒置原则的改革:

在这里插入图片描述

从此老板只依赖于奖金发的多少,就可以看到收益。店长也不担心被黑钱了。店员一看打卡天数满了就可以发全勤将的奖金,真不错。

总结:采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。

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

接口隔离原则的核心思想就是:不应该强迫客户程序依赖它们不需要使用的方法。

举例:

在这里插入图片描述

宠物店有A、B、C三只狗,它们有各自喜欢狗粮。现在有个榜单,上面写了有这些狗粮。这样就会存在问题。A、B、C三只狗都不爽,为什么要把我不喜欢的狗粮和我喜欢的狗粮放在一起,其他的狗粮配吗?我得咬死写这个榜单的人。三只狗都这么想,于是相关人员被咬了,于是修改为以下方案:

在这里插入图片描述

这样既满足接口隔离原则又满足单一职责原则

总结:假设不拆分,狗A拿到榜单,一看,心里就在想,这小子一看就不专业啊,居然这么来,把我不喜欢的都弄上去,我得找个机会咬死他,换个专业的来。

6.迪米特原则(Law of Demeter,LOD)

迪米特原则的核心思想就是:一个对象应当对其他对象尽可能少的了解。

举例:

在这里插入图片描述

可以看出非常复杂,甚至都不想看。根据迪米特原则进行重新构造,如下:

在这里插入图片描述

这降低了模块间的通信效率。

总结:猫A去吃猫粮的时候发现有其他猫在吃它喜欢的牌子的时候,心里不爽。谁把我最喜欢的猫粮放在这里的,让其他猫也吃的到。一点都不专业,我得找个机会挠死他。然后就又换了一个新员工,新员工把所有猫粮都拿到了自己这里,猫A来吃就给它,B来就给B。它们不知道吃的是什么牌子的,喜欢吃就完事了。虽然增加了干饭的时间,影响了直接干饭的效率,但是显得专业。

7.合成复用原则(Composite Reuse Principle,CRP)

优先使用组合而不是继承原则的核心思想就是:优先使用组合,而不是继承。

继承复用:实现简单,便于扩展。但是破坏系统的封装性。

组合复用:耦合性相对较低,选择性的调用成员对象的操作。可以再运行时动态运。.

优先使用组合而不是继承原则的意思就是:在复用对象的时候,要优先考虑使用组合,而不是继承,这是因为在使用继承时,父类的任何改变都可能影响子类的行为。而在使用组合时,是通过获得对其他对象的引用而在运行时刻动态定义的,有助于保持每个类的单一职责原则。

继承与组合都是面向对象中代码复用的方式。父类的内部细节对子类可见,其代码属于白盒式的复用,而组合中,对象之间的内部细节不可见,其代码属于黑盒式复用。继承在编码过程中就要指定具体的父类,其关系在编译期就确定,而组合的关系一般在运行时确定。继承强调的是is-a的关系,而组合强调的是has-a的关系。

举例:

在这里插入图片描述

由于是继承,子类知道细节。所以狗是一开始就知道这次的行动是偷狗粮,但是没办法为了狗族的荣耀,还是要派狗去,虽然知道被发现了难免一顿毒打,但也要去。这未战先怯,还在商量计划的时候,所有狗都怕,都紧张的一批。最后选了一个狗子,好在成功完成了任务。

下面是猫族组合偷猫粮法:
在这里插入图片描述

都是差不多的,为什么组合要好呢。原因就在于,最开始猫不知道是去偷猫粮,选择了一只猫,到了晚上准备行动的时候,这猫依然不知道干啥,知道行动的时候,才知道是去偷猫粮,直呼卧槽,但是箭在弦上,不得不偷。猫抱着不成功变成仁的想法,最后一气呵成,完成了任务。

总结:为什么选择组合呢。因为,狗子紧张了一天,还没到计划的时候就告密了,店主奖励了它,并让它晚上按计划进行。狗子成功得手,在分狗粮的时候,店长突然出现,罚了一群狗一天不能吃饭。狗族遭到巨大的损失(偷狗粮的狗子已经吃饱了)。猫在得手后,众猫分食,其乐融融。狗子们怀恨在心,但是也不知道谁告密了,于是找到了制定计划的狗,全部算在了它的头上。众狗决定找一个理由,用的是”你这个一点都不专业,都不规范“,从此以后,制定计划的狗子狗粮只吃一半。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值